proxy 动态代理深度学习.doc

上传人:鲁** 文档编号:556199728 上传时间:2024-02-11 格式:DOC 页数:7 大小:33KB
返回 下载 相关 举报
proxy 动态代理深度学习.doc_第1页
第1页 / 共7页
proxy 动态代理深度学习.doc_第2页
第2页 / 共7页
proxy 动态代理深度学习.doc_第3页
第3页 / 共7页
proxy 动态代理深度学习.doc_第4页
第4页 / 共7页
proxy 动态代理深度学习.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《proxy 动态代理深度学习.doc》由会员分享,可在线阅读,更多相关《proxy 动态代理深度学习.doc(7页珍藏版)》请在金锄头文库上搜索。

1、一.相关类及其方法:java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档)java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口。 invoke()在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。(详见api文档)二.源代码:被代理对象的接口及实现类:package com.ml.

2、test;public interface Manager public void modify();package com.ml.test;public class ManagerImpl implements Manager Overridepublic void modify() System.out.println(*modify()方法被调用);业务代理类:package com.ml.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Busines

3、sHandler implements InvocationHandler private Object object = null;public BusinessHandler(Object object) this.object = object;Overridepublic Object invoke(Object proxy, Method method, Object args) throws Throwable System.out.println(do something before method); Object ret = method.invoke(this.object

4、, args); System.out.println(do something after method); return ret;客户端类:package com.ml.test;import java.lang.reflect.Proxy;public class Client public static void main(String args) / 元对象(被代理对象) ManagerImpl managerImpl = new ManagerImpl(); / 业务代理类 BusinessHandler securityHandler = new BusinessHandler(

5、managerImpl); / 获得代理类($Proxy0 extends Proxy implements Manager)的实例. Manager managerProxy = (Manager) Proxy.newProxyInstance(managerImpl .getClass().getClassLoader(), managerImpl.getClass() .getInterfaces(), securityHandler); managerProxy.modify();三.执行结果:do something before method*modify()方法被调用do som

6、ething after method四.机制分析:Proxy.(ClassLoader loader, Class interfaces, InvocationHandler h)做了以下几件事.(1)根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy.$Proxy0类实现了interfaces的接口,并继承了Proxy类.(2)实例化$Proxy0并在构造方法中把BusinessHandler传过去,接着$Proxy0调用父类Proxy的构造器,为h赋值,如下:class Proxy Invocati

7、onHandler h=null; protected Proxy(InvocationHandler h) this.h = h; .下面是本例的$Proxy0类的源码(好不容易才把它提出来):import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy i

8、mplements Manager private static Method m1;private static Method m0;private static Method m3;private static Method m2;static try m1 = Class.forName(java.lang.Object).getMethod(equals, new Class Class.forName(java.lang.Object) ); m0 = Class.forName(java.lang.Object).getMethod(hashCode, new Class0); m

9、3 = Class.forName(com.ml.test.Manager).getMethod(modify, new Class0); m2 = Class.forName(java.lang.Object).getMethod(toString, new Class0); catch (NoSuchMethodException nosuchmethodexception) throw new NoSuchMethodError(nosuchmethodexception.getMessage(); catch (ClassNotFoundException classnotfounde

10、xception) throw new NoClassDefFoundError(classnotfoundexception.getMessage(); public $Proxy0(InvocationHandler invocationhandler) super(invocationhandler);Overridepublic final boolean equals(Object obj) try return (Boolean) super.h.invoke(this, m1, new Object obj ) .booleanValue(); catch (Throwable

11、throwable) throw new UndeclaredThrowableException(throwable); Overridepublic final int hashCode() try return (Integer) super.h.invoke(this, m0, null).intValue(); catch (Throwable throwable) throw new UndeclaredThrowableException(throwable); public final void modify() try super.h.invoke(this, m3, nul

12、l); return; catch (Error e) catch (Throwable throwable) throw new UndeclaredThrowableException(throwable); Overridepublic final String toString() try return (String) super.h.invoke(this, m2, null); catch (Throwable throwable) throw new UndeclaredThrowableException(throwable); 接着把得到的$Proxy0实例强制转换成Manager.当执行managerProxy.modify()方法时,就调用了$Proxy0类中的modify()方法.在modify方法中,调用父类Proxy中的h的invoke()方法.即InvocationHandler.invoke();

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号