代理
代理类(P259)
代理类可以在运行时创建全新的类。这样的代理类能够实现指定的接口。尤其是,它具有下列方法:
指定接口所需要的全部方法
Object类中的全部方法
然而,不能在运行时定义这些方法的新代码。而是要提供一个调用处理器(invocation handler)。调用处理器是实现了InvocationHandler接口的类对象。在这个接口中只有一个方法:
object invoke(Object proxy,Method method,Object[] args)
无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。调用处理器必须给出处理调用的方式。
代理类的特性(P262-263)
代理类实在程序运行过程中创建的。然而,一旦被创建,就变成了常规类,与虚拟机中的任何其他类没有什么区别。
所有的代理类都扩展于Proxy类。一个代理类只有一个实例域--调用处理器,它定义在Proxy的超类中。为了履行代理对象的职位责,所需要的任何附加数据都必须存储在调用处理器中。
所有的代理类都覆盖了Object类中的方法toString、equals、和hashCode。如果所有的代理方法一样,这些方法仅仅调用了处理器的invoke。
对于特定的类加载器和预设的一组接口来说,只能有一个代理类。也就是说,如果使用同一个类加载器和接口数组调用两次newProxyInstance方法的话,那么只能够得到同一个类的两个对象,也可以利用getProxyClass方法获得这个类
Class proxyClass = Proxy.getProxyClass(null,interfaces);
可以通过调用Proxy类中的isProxyClass方法检测一个特定的Class对象是否代表一个代理类。
java.lang.reflect.InvocationHandler 1.3
Object invoke(Object proxy,Method method , Object[] args)
定义了代理对象调用方法时希望执行的动作。
java.lang.reflect.Proxy 1.3
static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)
返回实现指定接口的代理类
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler)
构造实现指定接口的代理类的一个新实例。所有方法都会调用给定处理器对象的invoke方法。
ClassLoader
类加载器。null表示使用默认的类加载器。
Class<?>[]
Class对象数组,每个元素都是需要实现的接口。
InvocationHandler
一个调用处理器。
static boolean isProxyClass(Class<?> cl)
如果cl是一个代理类则返回true。
Last updated