一,代理模式定义:
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用;
二,目的:
1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
2)通过代理对象对原有的业务增强;
三,代理三大要素:
1,抽象对象(接口类):声明了真实对象和代理对象的公共接口
2,真实对象(接口实现类):代理对象所代表的真实对象,最终被引用的对象
3,代理对象(代理对象类):包含真实对象从而操作真实主题对象,相当于访问者与真实对象之间的中介。
注:JDK动态代理实际上是通过JDK在内存中帮你动态的生成一个接口实现类(作用:1,InvocationHandler实现类初始化;2,通过接口方法转发给InvocationHandler的invoke方法,此方法是接口方法,由代理类来实现的)而已,它的本质还是使用的静态代理
四,JDK动态代理模型:
示例:代理类为MyProxy.java,接口方法为getUserInfo()
1)Proxy:InvocationHandler类被作为Proxy内部属性。
2)代理类(比如MyProxy类):实现InvocationHandler接口类,invoke()接口方法中增强代码,实现自己业务逻辑。
调用链路:
MyProxy.getProxyInstance() —>>> Proxy.newProxyInstance() —>>>$Proxy0.getUserInfo() 中通过InvocationHandler实例转发到MyProxy.invoke()方法
注:$Proxy0是JDK动态生成的接口实现类。
Proxy通过以上调用链在内存中生成接口实现类($Proxy0),同时也将相应的InvocationHandler实现类(即代理类)给包装到$Proxy0中。
五,JDK源码中Proxy调用链:
生成class对象:
Proxy.newProxyInstance() —>>>Proxy.getProxyClass0(loader, intfs) —>>>WeakCache.subKeyFactory.apply(key, parameter) —>>>Proxy.apply()方法 —>>>ProxyGenerator.generateProxyClass ---->>>>defineClass0()方法
实例化:
—>>>cl.getConstructor(constructorParams) —>>>newInstance(cons, ih)
注:JDK动态代理中的两个重要类:Proxy、InvocationHandler