收藏 分销(赏)

AOP之动态proxy原理.doc

上传人:pc****0 文档编号:7778132 上传时间:2025-01-16 格式:DOC 页数:2 大小:32KB 下载积分:10 金币
下载 相关 举报
AOP之动态proxy原理.doc_第1页
第1页 / 共2页
AOP之动态proxy原理.doc_第2页
第2页 / 共2页
本文档共2页,全文阅读请下载到手机保存,查看更方便
资源描述
Dynamic Proxy 工作原理 Dynamic Proxy是由两个class实现的:java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler,后者是一个interface。 所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。:-) java.lang.reflect.Proxy中的重要(静态)方法如下: 1. public static Class getProxyClass(ClassLoader loader, Class[] interfaces); 该方法返回一个Dynamic Proxy Class给你(这个类是java.lang.reflect.Proxy类的子类的类对象),但你必须提供一个ClassLoader和一组interface定义给它。记住:每一个Class在JVM中都有一个对应的ClassLoader,这个Proxy就说这个loader是它的ClassLoader,它同时还“宣称”它实现了这些interface。 2. protected Proxy(InvocationHandler handler); Dynamic Proxy有这样一个构造方法,而且你只能用它生成实例。你对那些interface中所有方法的调用(基于该实例) 都会传到这个handler中。 更简单的方法是直接一步生成Dynamic Proxy的实例: 3. public static Object newProxyInstance(ClassLoader loader,                                       Class[] interfaces,                                       InvocationHandler h)                                throws IllegalArgumentException; 这个方法包含了上面两个方法的所有参数,而且意义相同。 java.lang.reflect.InvocationHandler中只有一个方法: public Object invoke(Object proxy, Method method, Object[] args); 对于Dynamic Proxy实例中方法的调用都将调到这个方法。其中proxy正是那个Dynamic Proxy实例,而method,args是被调用方法和参数。 比较java.lang.reflect.Method中的这个方法: public Object invoke(Object obj, Object[] args); 它说的是你现在调用obj实例中的Method.getName()方法,传递的参数是args。 实际上,所有的InvocationHandler都会调用Method中的这一方法,它是到达真正方法的唯一途径。 来看一个实例: public class Interceptor implements InvocationHander {     private Object obj;     public InvocationHandler(Object o)     {         obj = o; //保存实例,以备后用     }     public Object invoke(Object proxy, Method method, Object[] args)     {         system.out.println(“Enter interceptor”);         method.invoke(obj, args); //调用真正的方法     } } //假设obj是一个SmallWorldImpl的实例 SmallWorld sw = Proxy.newProxyInstance(obj.getClass().getClassLoader(),                                   obj.getClass().getDeclaredClasses(),                                   new Interceptor(obj)); sw.hello(4); 对于hello()的调用首先通过Interceptor的invoke()方法。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服