黑马程序员训练营:动态代理

动态代理

一、动态代理的思想分析

一个类,除了完成它的本职工作外,我们可能还希望它能够提供一些额外的功能,比如安全、事务、日志等,以便于使用者从不同的侧面考察这个类。

这样额外的功能是完全可以在类本身上实现的,然而当面对成千上万个类时,我们就显得力不从心了。

事实上,上述额外的功能具有很大的一般性,即多数类都有相同的需求,因此可以将额外的功能需求集成为一个接口,并交由第三方去实现和运行,这就是动态代理。

 

二、动态代理的实作原理

一般来说,额外的功能必须镶嵌在原始类的方法体内部才有意义,因此,准确的说,动态代理就是代理和干预原始类的方法的执行过程。

又由于干预方法的过程是独立于不同方法之外的,所以动态代理类可以将具体干预方法的过程委托给召唤方法器接口完成。而动态代理类要做的就是复制原始类指定接口中的所有方法的完整映像以及在各方法内部与委托执行方的连接过程。

1、动态代理类:根据原始类的Class对象和任意类加载器生成。

2、动态代理对象:根据召唤方法器接口提供的对象进行构造。

3、召唤方法器接口:根据建议的功能接口和目标对象实现干预方法的全部过程。

 

三、动态代理机制的重构

1、参数:

(1)Class对象:代理的目标类(也可以是目标类的对象)。

(2)目标类实现的接口:代理的入口方法。

(3)建议功能对象:以面向接口的形式提供。

2、返回:目标类的代理类的对象。

注意:为了使程序更为清晰,可以单独实现召唤方法器接口和建议功能接口,以为重构方法之用。

 

四、动态代理类与被被代理类之间的关系

当我重构好代理机制后,兴致勃勃的创建一个数组集合的代理对象去做一些操作,编译没有问题,但一运行却彻底懵了——无法进行类型转换。

我在想,代理机制返回给我一个Object对象,为什么不能将它转换为其他任意对象呢?

接着我做了个测试:int i=(Integer)(Object)("string"),果不其然,出现了相同的错误。

这就是说,一个对象的类型不仅表现在编译期间,更反映在运行期间。虽然代理机制返回给我的是一个Object对象,但事实上,其本原的类型却是代理类,跟目标类没有关系。因此不能强制将代理对象转换为目标类对象进行操作。

那么,我既然想用代理对象测试目标类的功能,现在一个Object对象又有什么方法可用呢?答案就在目标类实现的接口上,这是实现代理对象的参数之一。因此揣测JVM创造的代理类应该与目标类实现了相同的接口,正是这样的接口将目标类和代理类联系了起来。

代理类也正是通过接口定义的方法实现了对目标类的干预。


四、基于动态代理的AOP框架

AOP框架的核心任务是能够根据配置的目标类和目标类的建议信息获得目标类的代理对象。代理类通过接口与目标类发生关系,这也就暗示了:目标类是否需要跟代理类发生关系取决于其是否实现了指定的接口。这也就是为什么张老师在BeanFortacy的相关方法中首先对目标类对象是否属于某一接口作出判断后再决定是否为其返回代理对象。

除了指定的接口外,事实上,根据上述分析,代理类也实现了目标类本身就实现的接口,因此代理类也可通过其实现对目标类的相关方法代理。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值