Java动态代理的实现

来源:互联网 发布:淘宝助理5.5使用教程 编辑:程序博客网 时间:2024/05/29 16:28

    动态代理的实现可以说是静态代理的一种模式升级,如果还有同学不知道代理模式的概念可以参考我的前一篇文章http://blog.csdn.net/u012481172/article/details/50157079; 下面我们分四步走来讲解一下动态代理如何使用:

一、定义一个行为规范

public interface IService {    public String doSomething();}
    以上接口只需要由目标对象实现即可,因为我们现在不需要自己去创建代理,而是由JDK动态生成代理的。

二、实现自己的InvocationHandler

   

public class MyInvocationHandler implements InvocationHandler {// 目标对象private Object target;public MyInvocationHandler(Object target) {super();this.target = target;}/** * 此方法是实现了InvocationHandler的方法 * 是目标对象方法调用 */public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("在目标对象执行之前我先做一些事情...");// 执行目标对象的方法Object result = method.invoke(target, args);System.out.println("在目标对象执行之后我再做一些事情...");return result;}/** * 获取目标对象的代理对象 *  * @return 代理对象 */public Object getProxy() {return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(),this);}}
    以上就是实现了自己的InvocationHandler,这基本上就是一个规范的写法了,之后如果我们需要创建自己的InvocationHandler,就都按照此格式来。注意在getProxy()方法中,用到了Proxy类,该类是JDK下的一个系统类,并不是我上一篇文章自己的Proxy类。

三、实现目标对象

public class RealService implements IService {public String doSomething() {System.out.println("目标对象正在做一些事情...");return "目标对象正在做一些事情...";}}

四、目标对象的使用及打印测试

public static void main(String[] args) {// 实例化目标对象IService userService = new RealService();// 实例化InvocationHandlerMyInvocationHandler invocationHandler = new MyInvocationHandler(userService);// 根据目标对象生成代理对象IService proxy = (IService) invocationHandler.getProxy();// 调用代理对象的方法proxy.doSomething();}//================== 以下为打印结果在目标对象执行之前我先做一些事情...目标对象正在做一些事情...在目标对象执行之后我再做一些事情... 

五、相关资料

 (1)关于动态代理的好处与应用场景:请移步至http://www.zhihu.com/question/20794107;

 (2)关于Java动态代理的详细实现:请移步至:http://rejoy.iteye.com/blog/1627405;  

   

0 0
原创粉丝点击