在上篇中就对java反射机制做了一个详尽的介绍,相信你对反射也应该有一些了解,这时候你可能会问,那反射究竟在我们日常开发中都会用在什么地方呢,

特别是一些初级人员更不禁要问,怎么我们平常好像不用反射也能够开发。

在这里要纠正一点,其实只要你在用框架做开发,那么你时时刻刻都在反射打交道,如果没有反射,根本就不会有所谓的框架,至于具体细节,

我们这里埋一个伏笔,后面将会做些介绍。

首先,我们这里出一道题

给你一个未知的DTO(数据传输对象),然后创建出一个新的对象,并把原来对象属性的值都给新的对象,我们这里姑且称为复制对象,

按照我们以前所具备的的知识,我们应该会这么做。

DTO  newObj = new DTO();

newObj.setXXX(old.getXXX());

未知”,它有哪些属性,在编译期我们一无所知。你将如何实例化出一个它的对象,又如何调用它的方法。传进来的对象只有在运行期才能够知道。

这时候反射将会派上用场

大家一起看看代码具体怎么做的。


public Object copy(Object object) throws Exception{  
Class<?> clazz = object.getClass();

Object objectCopy = clazz.newInstance();

Field[] fields = clazz.getDeclaredFields();

for(int i=0;i<fields.length;i++){
Field field = fields[i];
String fieldName = field.getName();
0,1).toUpperCase();

"get"+firstLetter+fieldName.substring(1);
"set"+firstLetter+fieldName.substring(1);

new Class[]{});
new Class[]{field.getType()});

new Object[]{});

new Object[]{value});
}
return objectCopy;
}


测试类

打印结果:

public static void main(String[] args) throws Exception {  
new Customer();
22);
customer.setId(99L);
"hello");
new ReflectTest().copy(customer);
","+customerCopy.getAge()+","+customerCopy.getName());
}

99,22,hello

我们先梳理一遍,拿到具体的DTO对象,我们就可以拿到与之对应的Class对象(每个对象都有个与之对应的Class对象),然后我们可以根据这个Class对象去实例化出一个新的DTO对象。给对象赋值肯定要用到set方法,取原来对象的值要用到get方法,那怎么调用到这些方法呢?学了前面一篇,我们应该知道只要知道方法名就可以调用此方法名的方法。至于都有哪些方法,这个就好说了,有哪些属性就有哪些与之对应的get、set方法,属性名,是可以遍历取到的,是不是水到渠成了呢。

反射可能用到的地方

       如果让你去写一个EXCEL导出工具类,不管是用POI还是JXL,你会怎么做?

       传进来的肯定会有一个list对象(List<T>),你肯定也知道要给每行单元格依次赋值,从每个T对象中取值放到对应的单元格中,取值自然而然会调用getXXX方法。

        可是既然是工具类,可不是只对一种类型的数据进行导出,可能是导出用户类表(User),也可能是商品列表(Goods),也可能是其它。难道我们要对每个不同类型的列表都去写一个导出嘛,这显然是不可能的。反射在这里就会起到至关重要的作用,不管什么类型的对象,不管其中有哪些属性,属性是什么类型,我们可以通过反射拿到,也能得到与之对应的所有get、set方法。

反射在Struts2框架中的应用

       学过struts2框架的同学应该都知道一点,在action中,只要给页面传过来的值,生成一个与之匹配的get、set方法,我们就能直接拿到值, 而不是需要使用request.getParameter("")的方式进行取值。

       那为什么这样就可以拿到值了呢,是谁给你赋好值了,你会说,书上说的,老师这么教的,这样就可以。确实这样可以拿到值,我们开发中多半也是这么干的,可你难道就没想过为什么会有值吗。

这里反射就有很大的功劳,它会依据你的所有set方法,然后匹配传值,这些都有框架在给你实例化action的时候完成。

反射在Hibernate框架中的应用

session,save(对象),那它的底层又是怎样实现的呢?

insert into student(name,ages,addr)  values (?,?,?)

        hibernate无论怎么做,最终肯定也还是要发出自己的sql语句,它只不过是对JDBC做了一个更好的封装,那它是怎么知道那些字段的,显而易见还是通过反射,当然具体hibernate的封装肯定是很复杂的,但肯定少不了反射。反射机制的作用就是能够找到字段、方法和已加载类的构造函数的信息,并且能够应用反射域、方法和构造函数去操作各自的属性。

反射在Spring框架中的应用

         spring两大核心是IOC和AOP,这两个都用到了反射机制,以及AOP甚至用到了反射相关的动态代理。

         spring依赖注入DI或者叫做控制反转IOC,只要在在配置中配置好需要注入的类,并且给其生成好对应的set方法,spring容器在给我们实例化该对象的时候,就能根据反射给起注入需要的对象。配置中有的只是一个完整类名字符串,而不是什么对象,如果没有反射,这些都是不可能做到的,也就说没有反射,就没有所谓的框架。