JDK动态代理

一,代理模式定义:

给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用;

二,目的:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值