Java Dynamic Proxy

来源:互联网 发布:js ajax实例 编辑:程序博客网 时间:2024/06/06 03:09

代理模式

 代理模式的三个角色:

1.  抽象主题角色:声明真实主题和代理主题的共同接口

2.  代理主题:含有对真是主题的引用,可在任何时候操作真实主题

3.  真是主题:实现逻辑的类

类图如下:

图1

Java 动态代理

从JDK1.3开始,Java就引入了动态代理的概念。动态代理(Dynamic Proxy)可以帮助你减少代码行数,真正提高代码的可复用度。

 类图如下:

图2 

动态代理和普通的代理模式的区别,就是动态代理中的代理类是由java.lang.reflect.Proxy类在运行期时根据接口定义,采用Java反射功能动态生成的(图2的匿名实现类)。和java.lang.reflect.InvocationHandler结合,可以加强现有类的方法实现。如图2,图中的自定义Handler实现InvocationHandler接口,自定义Handler实例化时,将实现类传入自定义Handler对象。自定义Handler需要实现invoke方法,该方法可以使用Java反射调用实现类的实现的方法,同时当然可以实现其他功能,例如在调用实现类方法前后加入Log。而Proxy类根据Handler和需要代理的接口动态生成一个接口实现类的对象。当用户调用这个动态生成的实现类时,实际上是调用了自定义Handler的invoke方法。

下面是使用动态代理的步骤:

1.  Client向Proxy请求一个具有某个功能的实例;

2.  Proxy根据Subject,以自定义Handler创建一个匿名内部类,并返回给Client;

3.  Client获取该匿名内部类的引用,调用在Subject接口种定义的方法;

4.  匿名内部类将对方法的调用转换为对自定义Handler中invoke方法的调用

5. invoke方法根据一些规则做处理,如记录log,然后调用SubjectImpl中的方法

参考:

http://blog.csdn.net/tyrone1979/archive/2006/09/16/1232020.aspx