快速业务通道

Java动态代理机制分析及扩展,第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

Java动态代理机制分析及扩展,第2部分

时间:2011-06-21 IBM / 王忠平 何平

本文希望将 Java 动态代理机制从接口扩展到类,使得类能够享有与接口类 似的动态代理支持。

设计及特点

新扩展的类名为 ProxyEx,将直接继承于 java.lang.reflect.Proxy,也声 明了与原 Proxy 类中同名的 public 静态方法,目的是保持与原代理机制在使 用方法上的完全一致。

图 1. ProxyEx 类继承图

与原代理机制最大的区别在于,动态生成的代理类将不再从 Proxy 类继承, 改而继承需被代理的类。由于 Java 的单继承原则,扩展代理机制所支持的类数 目不得多于一个,但它可以声明实现若干接口。包管理的机制与原来相似,不支 持一个以上的类和接口同时为非 public;如果仅有一个非 public 的类或接口 ,假设其包为 PackageA,则动态生成的代理类将位于包 PackageA;否则将位于 被代理的类所在的包。生成的代理类也被赋予 final 和 public 访问属性,且 其命名规则类似地为“父类名 +ProxyN”(N 也是递增的阿拉伯数字)。最后, 在异常处理方面则与原来保持完全一致。

图 2. 动态生成的代理类的继承图

Java动态代理机制分析及扩展,第2部分(2)

时间:2011-06-21 IBM / 王忠平 何平

模板

通过对 Java 动态代理机制的推演,我们已经获得了一个通用的方法模板。 可以预期的是,通过模板来定制和引导代理类的代码生成,是比较可行的方法。 我们将主要使用两个模板:类模板和方法模板。

清单 1. 类模板

package &Package; final public class &Name &Extends &Implements {    private java.lang.reflect.InvocationHandler handler =  null;    &Constructors    &Methods }

类模板定制了代理类的代码框架。其中带“&”前缀的标签位被用来引导 相应的代码替换。在此预留了包(&Package)、类名(&ClassName)、 类继承(&Extends)、接口实现(&Implements)、构造函数集 (&Constructors)及方法集(&Methods)的标签位。类模板还同时声 明了一个私有型的调用处理器对象作为类成员。

清单 2. 方法模板

&Modifiers &ReturnType &MethodName (&Parameters) &Throwables {    java.lang.reflect.Method method = null;    try {      method = &Class.getMethod( \"& MethodName\",  &ParameterTypes );    }    catch(Exception e){    }    Object r = null;    try{      r = handler.invoke( this, method, &ParameterValues  );    }&Exceptions    &Return }

方法模板定制了代理类方法集合中各个方法的代码框架,同样的带“&” 前缀的标签位被用来引导相应的代码替换。在此预留了修饰符(&Modifiers )、返回类型(&ReturnType)、方法名(&MethodName)、参数列表( Parameters)、异常列表(&Throwables)、方法的声明类(&Class) 、参数类型列表(&ParameterTypes)、调用处理器的参数值列表 (&ParameterValues),异常处理(&Exceptions)及返回值 (&Return)的标签位。

代码生成

有了类模板和方法模板,代码生成过程就变得有章可依。基本过程可分为三 步:1)生成代理类的方法集合;2)生成代理类的构造函数;3)最后生成整个 代理类。

Java动态代理机制分析及扩展,第2部分(3)

时间:2011-06-21 IBM / 王忠平 何平

生成代理类的方法集

第一步,通过反射获得被代理类的所有 public 或 protected 且非 static 的 Method 对象列表,这些方法将

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号