复习一下反射技术,学的不是很深,所以简单的认识:
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代理:生成子类对象的动态代理