JDK动态代理说明

来源:互联网 发布:好用的安卓模拟器知乎 编辑:程序博客网 时间:2024/05/17 23:17

       如果我们想实现类似AOP的思想,自己写代码用代理或叫装饰模式也是可以实现的,但这样我们就面临必须给每个需要被装饰(我们暂时就叫它装饰吧)的接口写装饰子类,通过添加自己需要的特定功能并委托实体接口子类完成本体行为。这样我们需要写很多代码,而且很多时候都是重复代码,当然用种种模式可以把重复代码消减到最少,但看起来还是不怎么完美。

       这时候JDK的动态代理就其作用了,它帮我们减少了大量代码的编写工作,使我们可以将注意力放在我们需要添加的特定行为上。那JDK的动态代理又是如何完成的呢?它是通过动态继承基类Proxy并实现我们要代理的接口,将接口实现委托给InvocationHandler中的invoke, 将调用方法以参数形式传给invoke,同时InvocationHandler的子类持有真正的实体类对象以供方法调用。

JDK中动态代理就是代理模式的变体。如图

 

再看一例子:

 

上面的实现已经可以实现我们动态给某个方法添加其他功能了,但是它只能加一次,如果我们能以一种链化的动态代理,可以添加多层拦截那对实际应用可能更有效果,由此我们可以改变一下我们的设计,如图:

 

 

为了更好理解,看下例子。

 

再看下运行结果:

doBefore1
doBefore2
doBefore3
hello world
doAfter3
doAfter2
doAfter1

 

OK了,经过改造我们可以实现链化动态代理了,对于实际应用更能体现我们对各个层面上的切入

原创粉丝点击