序言
Java动态代理实现是基于反射和动态生成Class文件的技术,Proxy,InvocationHandler,Method是三个核心类,Proxy是代理类的入口,用来获取代理类,创建代理实例,获取InvocationHandler,判断某个类是否是代理类,InvocationHandler是方法调用的拦截,invoke方法是接口唯一方法,Method是反射的方法,用来完成方法调用。
案例看行为
我们先通过一个Person案例来看动态代理生成的代理类的模样。
1 | //公共接口 |
我们可以看下生成的$Proxy0类,该类是真正的代理类。分析可知:该类是final说明不可被子类化,并且继承Proxy的构造函数,这也就是Proxy构造函数为什么是protect的原因,同时实现了Person接口,说明代理类可以转型为Person,从而可以调用Person方法产生代理行为,在方法层面,所有的方法都是final方法。在$Proxy0 m0,m1,m2始终为hashCode,equals,toString方法,而m3,m4 …… 为目标接口的方法,我们可以看到当$Proxy0调用setName时候,实质调用了h.invoke(this, m4, new Object[]{var1})方法,也就是我们自定义的MyInvocationHandler#invoke方法,从而产生代理行为。
1 | public final class $Proxy0 extends Proxy implements Person { |
结构
通过案例,我们可以勾画出动态代理的结构
$Proxy0作为Proxy,Person作为Subject,而PersonImpl作为RealSubject是和设计模式代理模式一模一样。