java反射
1,java类的加载
java类的加载是指将.class文件(可能在磁盘,也可能在网络)加载到内存中,并为之生成java.lang.class对象的实例
java中类以其全限定包名作为唯一标识,jvm中则以全限定包名和类加载器作为唯一标识。
jvm中的类加载器有三个层次:根类加载器、扩展类加载器、系统类加载器。分别加载核心类,扩展jar包中的类以及classpath等指定的类。
(这部分的详细只是可以看书)
2,java反射
对象具有两种类型:编译时类型和运行时类型。
2.1 java.lang.class对象的获得方法:
1) 使用class类的forName(string elazzName);其中,elazzName为全限定包名
2)调用某个类的class属性,如Person.class
3)使用某个对象的getclass()方法
2.2 从class对象中获得信息
获取构造函数 1.getConstructor(class<?>... parameterTypes) 如 clazz.getConstructor(String.class,Interger.class) 2.getConstructors() 3.getDeclaredConstructors() 同样的方法,可以获得方法,field,注释等等
2.3 使用反射生成并操作对象
1)使用class对象的newInstance()方法,此时调用的是默认构造器
2)使用class对象获取指定的constructor对象,在调用该constructor对象的newInstance()方法,此时可以使用默认的构造器
这种动态地,根据配置文件创建对象的方法,在大型框架平台经常采用
2.4调用方法
1)在利用class对象的getMethods(),getMethod()方法获取method对象
2)调用method对象的invoke(Object obj,Object.. args)方法进行方法调用
使用这种方法的时候,会受到java语言访问权限的制约,可以利用setAccessable(boolean flag)方法设定权限可达
2.5 获取/设置属性值
1)在利用class对象的getFields(),getField()方法获取Field对象
2)获取:调用field对象的getXxx(Object obj)或者get()方法进行方法调用
3)设置:调用field对象的setXxx(Object obj,Xxx val)或者set(Object obj,Object val)方法进行方法调用
使用这种方法的时候,会受到java语言访问权限的制约,可以利用setAccessable(boolean flag)方法设定权限可达
java动态代理与AOP(更高一级的解耦,面向切面编程)
proxy用来创建动态代理,有两种方法:
1)static class<?> getProxyClass(classLoader loader,class<?> ...interfaces)创建一个动态代理对应的class对象,该代理类将实现interfaces所指定的多个接口,
2)static Object newProxyInstance(classLoader loader,class<?> ...interfaces,InvocationHandler handler)创建一个动态代理对象,该代理类对象将实现interfaces所指定的多个接口,执行代理对象的每个方法时候都会被替换执行InvocationHandler的invoke方法
这部分比较糊涂,暂且记得:
动态代理在AOP中被称为AOP代理,AOP代理可以代替目标对象,包含了目标对象的全部方法,但是AOP代理中的方法与目标对象的方法存在差异,可以在其之前、之后插入一些通用处理。