首页 > 代码库 > java反射

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.class2.getConstructors()3.getDeclaredConstructors()同样的方法,可以获得方法,field,注释等等
反射生成的class对象的相关信息

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代理中的方法与目标对象的方法存在差异,可以在其之前、之后插入一些通用处理。