资源描述
Dynamic Proxy 工作原理
Dynamic Proxy是由两个class实现的:java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler,后者是一个interface。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。:-)
java.lang.reflect.Proxy中的重要(静态)方法如下:
1. public static Class getProxyClass(ClassLoader loader, Class[] interfaces);
该方法返回一个Dynamic Proxy Class给你(这个类是java.lang.reflect.Proxy类的子类的类对象),但你必须提供一个ClassLoader和一组interface定义给它。记住:每一个Class在JVM中都有一个对应的ClassLoader,这个Proxy就说这个loader是它的ClassLoader,它同时还“宣称”它实现了这些interface。
2. protected Proxy(InvocationHandler handler);
Dynamic Proxy有这样一个构造方法,而且你只能用它生成实例。你对那些interface中所有方法的调用(基于该实例) 都会传到这个handler中。
更简单的方法是直接一步生成Dynamic Proxy的实例:
3. public static Object newProxyInstance(ClassLoader loader,
Class[] interfaces,
InvocationHandler h)
throws IllegalArgumentException;
这个方法包含了上面两个方法的所有参数,而且意义相同。
java.lang.reflect.InvocationHandler中只有一个方法:
public Object invoke(Object proxy, Method method, Object[] args);
对于Dynamic Proxy实例中方法的调用都将调到这个方法。其中proxy正是那个Dynamic Proxy实例,而method,args是被调用方法和参数。
比较java.lang.reflect.Method中的这个方法:
public Object invoke(Object obj, Object[] args);
它说的是你现在调用obj实例中的Method.getName()方法,传递的参数是args。
实际上,所有的InvocationHandler都会调用Method中的这一方法,它是到达真正方法的唯一途径。
来看一个实例:
public class Interceptor implements InvocationHander
{
private Object obj;
public InvocationHandler(Object o)
{
obj = o; //保存实例,以备后用
}
public Object invoke(Object proxy, Method method, Object[] args)
{
system.out.println(“Enter interceptor”);
method.invoke(obj, args); //调用真正的方法
}
}
//假设obj是一个SmallWorldImpl的实例
SmallWorld sw = Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getDeclaredClasses(),
new Interceptor(obj));
sw.hello(4);
对于hello()的调用首先通过Interceptor的invoke()方法。
展开阅读全文