一、基本概念
Java 动态代理 有两个重要的类和接口InvocationHandler
(接口)和Proxy
(类),这一个类Proxy
和接口InvocationHandler
是我们实现动态代理的核心;
InvocationHandler
接口是proxy
代理实例的调用处理程序实现的一个接口,每一个proxy
代理实例都有一个关联的调用处理程序;
在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke
方法
每一个动态代理类的调用处理程序都必须实现InvocationHandler
接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,当我们通过动态代理对象调用一个方法时候,这个方法的调用就会被转发到实现InvocationHandler
接口类的invoke方法来调用
二、示例一
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//定义接口
interface Shopping {
String buy();
}
//定义接口实现类 Client
class Client implements Shopping {
public String buy() {
System.out.println("我想买这件商品");
return "那就买它!!!";
}
}
//代理操作类
class DynamicProxy implements InvocationHandler {
private Object target = null;
DynamicProxy(Object target) {
this.target = target;
}
/**
* 代理方法逻辑
*
* @param proxy 代理对象
* @param method 调度方法
* @param args 调度方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
Object invoke = method.invoke(target, args);
System.out.println("代理后");
return invoke;
}
}
public class ProxyTest {
public static void main(String[] args) {
Shopping client = new Client();
//实例化代理操作类
DynamicProxy dyProxy = new DynamicProxy(client);
//获取动态代理对象 shop
Shopping shop = (Shopping) Proxy.newProxyInstance(Shopping.class.getClassLoader(), new Class[]{Shopping.class}, dyProxy);
System.out.println(shop.buy());
}
}
代码执行的流程就是
(1)获取动态代理对象 shop
(2)调用shop 的方法 buy ,这会转发到 DynamicProxy
的invoke
方法内调用,这里的 invoke
实际上就是对转发的方法的进行的操作,这里的操作时继续转发 method.invoke
,当然还可以有其他的操作。
三、示例二
这里的invoke
就是一个封装参数,然后转发到Executor
的操作
四、method.invoke
method.invoke
实现的是对方法的转发执行
示例可 点击参考