快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
Type();      return getTypeHelper(c) + "[]";    }    else    {      return type.getName();    } }

第三步,将所生成的方法保存进一个 map 表,该表记录的是键值对(方法声 明,方法实现)。由于类的多态性,父类的方法可能被子类所覆盖,这时以上通 过遍历所得的方法列表中就会出现重复的方法对象,维护该表可以很自然地达到 避免方法重复生成的目的,这就维护该表的原因所在。

生成代理类的构造函数

相信读者依然清晰记得代理类是通过其构造函数反射生成的,而构造时传入 的唯一参数就是调用处理器对象。为了保持与原代理机制的一致性,新的代理类 的构造函数也同样只有一个调用处理器对象作为参数。模板简单如下

清单 6. 构造函数模板

public &Constructor(java.lang.reflect.InvocationHandler  handler) {    super(&Parameters);    this.handler = handler; }

需要特别提一下的是 super 方法的参数值列表 &Parameters 的生成, 我们借鉴了 Mock 思想,侧重于追求对象构造的成功,而并未过多地努力分析并 寻求最准确最有意义的赋值。对此,相信读者会多少产生一些疑虑,但稍后我们 会提及改进的方法,请先继续阅读。

生成整个代理类

通过以上步骤,构造函数和所有需被代理的方法的代码已经生成,接下来就 是生成整个代理类的时候了。这个过程也很直观,通过获取相关信息并对类模板 中各个标签位进行替换,便可以轻松的完成整个代理类的代码生成。

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

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

被遗忘的角落:类变量

等等,似乎遗忘了什么?从调用者的角度出发,我们希望代理类能够作为被 代理类的如实代表呈现在用户面前,包括其内部状态,而这些状态通常是由类变 量所体现出来的,于是就涉及到类变量的代理问题。

要解决这个问题,首先需要思考何时两者的类变量可能出现不一致?回答了 这个问题,也就找到了解决思路。回顾代理类的构造函数,我们以粗糙的方式构 造了代理类实例。它们可能一开始就已经不一致了。还有每次方法调用也可能导 致被两者的类变量的不一致。如何解决?直观的想法是:1)构造时需设法进行 同步;2)方法调用之前和之后也需设法进行同步。这样,我们就能够有效避免 代理类和被代理类的类变量不一致的问题的出现了。

但是,如何获得被代理类的实例呢?从当前的的设计中已经没有办法做到。 既然如此,那就继续我们的扩展之旅。只不过这次扩展的对象是调用处理器接口 ,我们将在扩展后的接口里加入获取被代理类对象的方法,且扩展调用处理器接 口将以 static 和 public 的形式被定义在 ProxyEx 类中。

清单 7. ProxyEx 类内的静态接口 InvocationHandlerEx

public static interface InvocationHandlerEx extends  InvocationHandler {    // 返回指定 stubClass 参数所对应的被代理类实体对象    Object getStub(Class stubClass); }

新的调用处理器接口具备了获取被代理类对象的能力,从而为实现类变量的 同步打开了通道。接下来还需要的就是执行类变量同步的 sync 方法,每个动态 生成的代理类中都会被悄悄地加入这个私有方法以供调用。每次方法被分派转发 到调用处理器执行之前和之后,sync 方法都会被调用,从而保证类变量的双向 实时更新。相应的,方法模板也需要更新以支持该新特性。

清单 8. 更新后的方法模板(部分)

Object r = null; try{    // 代理类到被代理类方向的变量同步    sync(&Class, true);    r = handler.invoke( this, method, &ParameterValues  );    // 被代理类到代理类方向的变量同步    sync(&Class, false

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