在java运行时环境,对于任何一个类,可以知道这个类有哪些方法和属性。
对于任何一个对象,可以调用它的任何一个方法。
动态获取类的信息,动态调用对象的方法的功能源于java的反射机制。
java反射机制主要提供了以下功能:
1.运行时判断任何一个对象所属的类。
2.运行时构造任何一个类的对象。
3.运行时判断任何一个类所具有的成员变量和方法。
4.运行时调用任何一个对象的方法。
5.生成动态代理。
发射相关的类和包:
java.lang.reflect
Class,Field,Method,Construtor,Array
java.lang.Class类
getName() 获得类的完整名字
getFields() 获得类的public属性
getDeclaredFields() 获得所有属性
getMethods() 获得方法
getDeclaredMethods() 获得所有方法
getMethod(String name,Class [] parameterTypes) 根据方法名字和参数序列类型,获得方法
getConstrutors() 获得public的构造方法
getConstrutor(Class [] parameterTypes) 根据参数类型序列获得构造方法
getComponentType() 表示数组组件类型的Class
newInstance() 通过类的不带参数的构造方法,创建一个类的实例
1.通过默认构造方法创建一个新的对象
Object objCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
2.方法调用
Object method.invoke(Object obj,Object .. obj)
3.创建数组
Array.newInstance(classType,size);
应用:远程方法调用
代理模式
代理类和委托类实现了相同的接口
代理类负责为委托类预处理消息,过滤消息,把消息传给委托类,后处理。
代理类和委托类存在关联关系,代理类的对象并不真正实现服务,而是通过调用委托类的相关联的方法,来提供特定的服务。
按照代理类的创建时期,分为两种:
静态代理类:由程序员或者特定工具自动生成源代码,再对其进行编译。在程序运行前,代理类的class文件就已经存在。
动态代理类:在程序运行的时候,运用反射机制动态创建而成。
动态代理相关的包和类:
java.lang.reflect
Proxy和InvocationHandler
Proxy提供了静态方法负责创建动态代理类及其实例的方法:
1.public static Class<?> getProxyClass(ClassLoader loader,Class<?>[]interfaces) 创建动态代理类
loader类加载器
interfaces 动态代理类需要实现的所有接口
2.public static Object newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler handler) throws IllegalArgumentException
创建动态代理类的实例
Proxy类的静态方法创建的动态代理类具有以下特点:
1.动态代理类是public,final和非抽象类型的。
2.动态代理类继承了java.lang.reflect.Proxy类。
3.动态代理类的名字以$Proxy开头。
4.动态代理类实现了getProxyClass()和newProxyInstance()方法参数interfaces指定的所有接口。
5.Proxy类的isProxyClass(Class<?> cl)静态方法可以用来判断参数指定的类是否为动态代理类。只有通过Proxy创建的类才是动态代理类。
6.动态代理类都有一个public类型的构造方法,该构造方法有一个InvocationHandler类型的参数。
Proxy类的静态方法创建的动态代理类的实例具有以下特点:
1.假定变量foo是一个动态代理类的实例,并且这个动态代理类还实现了Foo接口,那么"foo instanceof Foo"的值为true。
把foo强制转换为Foo类型是合法的,(Foo)foo。
2.每一个动态代理类都和一个InvocationHandler实例相关。Proxy类的静态方法getInvocationHandler(Object proxy)返回这个InvocationHandler实例。
3.假定Foo接口只有一个方法,那么当程序调用动态代理类实例foo的amethod()方法时,该方法会调用与它相关联的InvocationHandler对象的invoke()方法。
InvocationHandler接口
Object invoke(Object proxy,Method method,Object [] params) throws throwable;