复习一下反射技术,学的不是很深,所以简单的认识:

1.反射:获取class对象,然后调用.class中的所有的成员变量,成员方法,构造方法。

2.3中方式:

 a.Object.class();

 b.obj.getClass();

 c.Class.forName("String className");

推荐使用C:传入一个字符串就可以获取类对象,所有可以将这个字符串写在配置文件中,这样我们需要获取别的类的类对象,只有改变配置文件的className,不需要修改代码。这样避免吧代码写死,实现代码的复用性。

3.作用:Constractor,Method,Field,Class

4.反射在泛型中的使用:反射避开泛型检查

List<Integer> list;

那么list.add()我们只能添加int,不能添加别的类型,如String,但是源码中add(E e),说明参数可以是任何object,通过反编译我们会发现,编译过的class文件中只有List list,其实泛型就是编译的时候执行的,运行的时候根本没有这个泛型检查,所以想要在添加别的类型,且编译不报错,我们可以获取源码,然后调用源码的add();

list.getClass().getMethod("add",Object.class).invoke(list,"hello");

 

5.反射在代理中的使用:Proxy,InvocationHandler

a.jdk自带的接口动态代理对象:

条件就是接口,实现类,想要对实现类的方法进行增强。

增强

method.invoke(target,args);

增强

比如说:计算ArrayList.add()方法执行时间:我们没有办法去修改源码,去计时,可以写个类 impelement List,然后重写add方法

另一种就是生成接口的动态代理,然后在方法执行前后进行增强,使用计时工具System.nanoTime()

b.cglib代理:生成子类对象的动态代理

 

posted on 2018-01-03 08:51  小院子...ing  阅读(119)  评论(0编辑  收藏  举报