- 浏览: 144089 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (110)
- CoreJava (18)
- 待解决 (1)
- 数据结构 (3)
- 科普 (2)
- 网站 (1)
- DataBase (8)
- Access (1)
- Asp (1)
- JSP (1)
- 操作系统 (8)
- Tech (1)
- Linux (11)
- Career (5)
- MongoDB (1)
- Embedded (1)
- JavaScript (1)
- UltraIso (1)
- Linux命令 (1)
- DesignPattern (1)
- Ruby (13)
- Vim (1)
- 自考 (2)
- Github (5)
- zrProject (1)
- Emacs (4)
- Math (3)
- Ajax (1)
- 没看懂 (1)
- HTML (1)
- Philosophy (1)
- 软件 (1)
- 面试 (1)
- 考试报名 (3)
- Regex (1)
- 日语 (1)
- 生活 (1)
最新评论
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
- package com.royzhou.reflect;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- public class ReflectTest {
- private String id;
- private String name;
- public String property;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getProperty() {
- return property;
- }
- public void setProperty(String property) {
- this.property = property;
- }
- public ReflectTest() {
- System.out.println("this is a constructor with no params!!!");
- }
- public ReflectTest(String param) {
- System.out.println("this is a constructor with param :" + param
- + "!!!");
- }
- /**
- * 创建对象
- *
- * @param clazz
- * @param paramTypes:构造函数参数,如果为null表示调用无参函数
- * @return
- * @throws Exception
- */
- public Object createObject(Class clazz, Class[] paramTypes)
- throws Exception {
- Object obj = null;
- if (paramTypes == null) {
- // 无参构造函数
- obj = clazz.newInstance();
- } else {
- // 有参构造函数
- Constructor con = clazz.getConstructor(paramTypes);
- obj = con.newInstance("Test String param");
- }
- return obj;
- }
- /**
- * 激活对象的某个方法
- *
- * @param obj
- * @param methodName
- * @throws Exception
- */
- public void invokeMethod(Object obj, String methodName) throws Exception {
- Method[] methods = obj.getClass().getDeclaredMethods(); // 拿到当前类的全部方法,包括私有的和公有的
- methods = obj.getClass().getMethods(); // 拿到当前类以及父类的所有公有方法
- for (Method m : methods) {
- if (m.getName().equals(methodName)) {
- m.invoke(obj, new Object[] {}); // 调用方法
- }
- }
- }
- public void getFileds(Object obj) throws Exception {
- Field[] fields = obj.getClass().getFields(); // 获取公有的属性
- fields = obj.getClass().getDeclaredFields(); // 获取公有私有属性
- for (Field f : fields) {
- System.out.println(f.getName());
- }
- }
- public void overload(String s) {
- System.out.println("param is String :" + s);
- }
- public void overload(int i) {
- System.out.println("param is int :" + i);
- }
- public void testInvoke() {
- System.out.println("this is a method for invoke test!!!");
- }
- public static void main(String[] args) throws Exception {
- ReflectTest rt = new ReflectTest();
- Object obj = rt.createObject(ReflectTest.class, null);
- System.out.println("--------------");
- obj = rt.createObject(ReflectTest.class, new Class[] { String.class });
- System.out.println("--------------");
- rt.invokeMethod(obj, "testInvoke");
- System.out.println("--------------");
- Method m = obj.getClass().getMethod("overload", int.class);
- m.invoke(obj, new Object[] { 1 });
- System.out.println("--------------");
- m = obj.getClass().getMethod("overload", String.class);
- m.invoke(obj, new Object[] { "test overload String" });
- System.out.println("--------------");
- rt.getFileds(obj);
- }
- }
利用java的反射机制可以进行简单的ORM即对象关系映射
如下面代码:
- import java.lang.reflect.Method;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.util.ArrayList;
- import java.util.List;
- public class ORMTest {
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- User user = (User) getObject(
- "select id as Id, name as Name from user where id=1",
- User.class);
- System.out.println(user);
- }
- public static List<Object> getObjects(String sql, Class clazz)
- throws Exception {
- Connection conn = null;
- PreparedStatement ps = null;
- ResultSet rs = null;
- try {
- conn = JdbcUtils.getConnection();
- ps = conn.prepareStatement(sql);
- rs = ps.executeQuery();
- String[] colNames = getColNames(rs);
- List<Object> objects = new ArrayList<Object>();
- Method[] ms = clazz.getMethods();
- while (rs.next()) {
- Object object = clazz.newInstance(); //
- for (int i = 0; i < colNames.length; i++) {
- String colName = colNames[i];
- String methodName = "set" + colName;
- for (Method m : ms) {
- if (methodName.equals(m.getName())) {
- m.invoke(object, rs.getObject(colName));
- break;
- }
- }
- objects.add(object);
- }
- }
- return objects;
- } finally {
- JdbcUtils.free(rs, ps, conn);
- }
- }
- private static String[] getColNames(ResultSet rs) throws Exception {
- ResultSetMetaData rsmd = rs.getMetaData();
- int count = rsmd.getColumnCount();
- String[] colNames = new String[count];
- for (int i = 1; i <= count; i++) {
- colNames[i - 1] = rsmd.getColumnLabel(i);
- }
- return colNames;
- }
- public static Object getObject(String sql, Class clazz) throws Exception {
- Connection conn = null;
- PreparedStatement ps = null;
- ResultSet rs = null;
- try {
- conn = JdbcUtils.getConnection();
- ps = conn.prepareStatement(sql);
- rs = ps.executeQuery();
- String[] colNames = getColNames(rs);
- Object object = null;
- Method[] ms = clazz.getMethods();
- if (rs.next()) {
- object = clazz.newInstance();
- for (int i = 0; i < colNames.length; i++) {
- String colName = colNames[i];
- String methodName = "set" + colName;
- for (Method m : ms) {
- if (methodName.equals(m.getName())) {
- m.invoke(object, rs.getObject(colName));
- break;
- }
- }
- }
- }
- return object;
- } finally {
- JdbcUtils.free(rs, ps, conn);
- }
- }
- }
在这个简单的ORM中,利用Java的反射机制动态创建实例,不需要事先知道要生成什么对象或对象集合,只需要在调用的时候转型(当然也可以使用jdk1.5的泛型技术),使用m.invoke(object, rs.getObject(colName))方法动态设置实例的属性,注意,在这个例子中,user类必须是一个标准的Javabean,具有各个属性的setter/getter方法以及一个没有参数的构造函数,上面例子中使用sql的别名来实现动态调用对象的方法,(Hibernate使用配置文件.hbm.xml文件完成数据库字段到javabean的映射),只需要在写查询sql的时候指定好别名就可以完成javabean属性的设置。
假如有另外一个类 Product
- public class Product {
- private String id;
- private String name;
- private String manufatrue;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getManufatrue() {
- return manufatrue;
- }
- public void setManufatrue(String manufatrue) {
- this.manufatrue = manufatrue;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Product() {
- }
- }
这样我们在查询的时候只需要执行下面语句就可以获得封装好的Product对象/集合
- Product product= (Product ) getObject("select id as Id, name as Name ,manufature as Manufature from product where id=1",Product .class);
这样的代码更具有动态性,不用每个查询写一个查询方法
发表评论
-
Eclipse插件安装
2012-03-28 09:29 863装载:http://gooss.org/are-two- ... -
Date & Calendar 类的使用
2012-03-27 14:19 625Java 语言的Calendar(日历),Date(日期 ... -
Java文件流 编码问题 - 读取文件时指定字符编码
2012-03-25 22:04 11492折磨了一天的问题,终于在黄昏的时候解决了,现在一吐为 ... -
打jar包
2012-02-04 17:12 712其实JAR文件的格式是ZIP ... -
JavaBean - Bound属性
2012-02-04 15:54 9654.4.3 Bound属性 Bound属性表示当该种 ... -
怎样在程序里获得一个空指针?
2012-01-28 15:56 6326.2 怎样在程序里获 ... -
制作可执行的Jar包
2012-01-22 16:35 695通常有两种,一种是制 ... -
Thread Local
2012-01-22 10:28 697What is Thread Local? Threa ... -
Jni介绍
2011-10-26 19:33 557http://baike.baidu.com/view/127 ... -
获取外网IP地址
2011-10-26 18:47 853访问 http://checkip.dyndns.org/ -
this 与 getSource() 细节
2011-10-14 19:33 652一个对象实例化之后,在它的方法体中出现的this就是指自身。a ... -
static变量生存周期
2011-10-13 22:38 874标准规定static变量保证在第一次使用前初始化,但是并不保证 ... -
String 引用类型与基本类型区别
2011-10-13 22:20 778String a="A"; Stri ... -
为什么会有serialVersionUID
2011-10-13 21:17 589java文件中为什么会有s ... -
抽象类与接口的区别
2011-10-09 11:30 507首先,我们来看一下抽象类的概念,java编程思想中说“万物皆对 ... -
transient用法
2011-09-19 11:16 774Java的serialization提供了一种持久化对象实例的 ... -
例1.1 TextFileTest
2011-07-06 23:19 625package SectionIO; import java ...
相关推荐
NULL 博文链接:https://lunzi.iteye.com/blog/1675871
利用Java反射和注解实现自定义的ORM,并提供相应的工具类自动生成CRUD的SQL语句,同时定义了完整的异常处理机制
例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/...
Liberg ...利用Java的反射机制,动态地创建对象、为对象属性赋值,就可以很容易地实现将数据表中的一条记录转换为一个Java实体类的对象。可以肯定的是,几乎所有ORM(Object Relational Mapping)框架就
利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...
我们知道ASP.NET MVC有个强大的地方就是Form表单提交到action的时候,可以直接将Form的参数直接装配到action的参数...我们其实可以利用反射来实例化对象的(自动装配) 好了废话不多…. pageload里面很简单了 代码如
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入...
21.4.1 利用数据库系统的独占锁来实现悲观锁 21.4.2 由应用程序实现悲观锁 21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制...
21.4.1 利用数据库系统的独占锁来实现悲观锁 21.4.2 由应用程序实现悲观锁 21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制...
21.4.1 利用数据库系统的独占锁来实现悲观锁 21.4.2 由应用程序实现悲观锁 21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制...
21.4.1 利用数据库系统的独占锁来实现悲观锁 21.4.2 由应用程序实现悲观锁 21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制...
2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求后各调一次。 4、拦截器可以利用依赖注入,因此在spring框架程序中,...
mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之...
implements (关键字) 实现 ['implimәnt] import (关键字) 引入(进口,输入) Info n.信息 (information [,infә'meiʃәn] ) Inheritance [java] 继承 [in'heritәns] (遗传,遗产) initialize 预置 初始化 [i'ni...