动态代理和静态代理角色一样
动态代理的代理类是动态生成的
动态代理分为两大类:
基于接口的动态代理(JDK 动态代理)、基于类的动态代理(cglib)
也可以用 Java 字节码实现(Javassist)
Proxy:代理
InvocationHandler:调用处理程序
动态代理的本质,就是使用反射机制实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}//生成得到代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}//处理代理实例,并返回结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//动态代理的本质,就是使用反射机制实现Object result = method.invoke(target, args);return result;}}
客户端访问时,
先 new 一个真实角色,
再 new 一个代理角色(本质上这个代理角色不存在)
设置要代理的对象,调用 set 方法
最后动态生成代理类,调用 getProxy() 方法,强转成真实角色
总结:
InvocationHandler 是由代理实例的调用处理程序实现的接口
每个代理实例都有一个关联的调用处理程序,
当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的 invoke 方法
Proxy 提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类
动态代理的好处:
1.真实角色操作更纯粹,不用去关注公共业务
2.公共业务交给代理角色,实现业务分工
3.公共业务发生扩展时,方便集中管理
4.一个动态代理类代理的是一个接口