快速业务通道

如何使用Proxy模式及Java内建的动态代理机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
blic class DynamicProxyHandler implements InvocationHandler {    private Object proxied;    public DynamicProxyHandler(Object proxied) {     this.proxied = proxied;    }    public Object invoke(Object proxy, Method method, Object[] args)       throws Throwable {     System.out.println("**** proxy: ****\n" + proxy.getClass()         + "\nmethod: " + method + "\nargs: " + args);     if (args != null)       for (Object arg : args)         System.out.println(" " + arg);     return method.invoke(proxied, args);    } }

这里的private Object proxied;即代理实例,也即上文代理模式中介绍的RealSubject对象。

在invoke()方法中,我们会打印它的所有参数,并调用当前代理的方法。

测试类DynamicProxyDemo.java

package com.zj.proxy.client; import java.lang.reflect.Proxy; import com.zj.proxy.Subject; import com.zj.proxy.RealSubject; import com.zj.proxy.dynamic.DynamicProxyHandler; public class DynamicProxyDemo {    public static void consumer(Subject subject) {     subject.operation1();     subject.operation2("ZJ");    }    public static void main(String[] args) {      RealSubject real = new RealSubject();     System.out.println("===Without Proxy===");     consumer(real);     System.out.println("===Use Proxy===");     Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class         .getClassLoader(), new Class[] { Subject.class },         new DynamicProxyHandler(real));     consumer(proxy);    } }

如何使用Proxy模式及Java内建的动态代理机制(4)

时间:2011-03-23 zhangjunhd

这里通过Proxy的静态方法newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)生成代理类,并传递与其关联的调用处理程序new DynamicProxyHandler(real)。

对于newProxyInstance()的参数:

[1]loader - 定义代理类的类加载器 ;

[2]interfaces - 代理类要实现的接口列表 ;

[3]h - 指派方法调用的调用处理程序 。

测试结果:

===Without Proxy=== Realer do operation1 Realer do operation2 with ZJ ===Use Proxy=== **** proxy: **** class $Proxy0 method: public abstract void com.zj.proxy.Subject.operation1() args: null Realer do operation1 **** proxy: **** class $Proxy0 method: public abstract void com.zj.proxy.Subject.operation2(java.lang.String) args: [Ljava.lang.Object;@de 6f 34   ZJ Realer do operation2 with ZJ

从结果可以发现,通过代理可以得到当前被调用的方法,及其参数。代理过程可以基于此进行逻辑处理,测试程序只是简单的打印这些相关信息。

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/69996

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号