Java动态代理InvocationHandler和Proxy
Java动态代理InvocationHandler和Proxy
1. 技术介绍
java动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类),这一个类Proxy和接口InvocationHandler是我们实现动态代理的核心
-
InvocationHandler接口是proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法,每一个动态代理类的调用处理程序都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,当我们通过动态代理对象调用一个方法时候,这个方法的调用就会被转发到实现InvocationHandler接口类的invoke方法来调用
-
Proxy类就是用来创建一个代理对象的类,它提供了很多方法,但是我们最常用的是newProxyInstance方法。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:
- ClassLoader :一个Classloader对象,定义了由哪个classloader对象来加载生成的代理类
- Class<?>[]:一个接口对象数组,表示我们将要给我们的代理对象提供一组什么样的接口,相当于代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。
- InvocationHandler :一个InvocationHandler对象,表示的是当动态代理对象(需要执行代理方法的类)调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由这个InvocationHandler对象调用。
2. 实例
public <T> T getProxy(Class<?> interfaze) {
//用这interfaze类来加载代理类(匿名内部类)
ClassLoader classLoader = interfaze.getClassLoader();
//将interfaze.claas放到Class数组中,以便代理类实现里面的方法
Class<?>[] interfaces = new Class<?>[] { interfaze };
/*
*每一个动态代理类的调用处理程序都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类 调用处理程序中,当我们通过动态代理对象调用一个方法时候,这个方法的调用就会被转发到实现InvocationHandler接口类的 invoke方法来调用
//这里是new一个实现了InvocationHandler接口的匿名内部类
*/
InvocationHandler h = new InvocationHandler() {
//相当于对匿名内部类方法的执行
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method和args是在被代理类调用方法时传递过来的,args是参数列表(实参)
rmiClient.doRemoteInvoker(method, args);
//被代理类获得方法的返回值结果
return rmiClient.getResult();
}
};
//classLoader:被代理的类 interfaces方法存在的接口 h:一个InvocationHandler对象
//创造匿名内部类(接口方法的实现类)
return (T) Proxy.newProxyInstance(classLoader, interfaces, h);
}

浙公网安备 33010602011771号