Java动态代理机制分析及扩展,第2部分 - 编程入门网
Type();
return getTypeHelper(c) + "[]";
}
else
{
return type.getName();
}
}
第三步,将所生成的方法保存进一个 map 表,该表记录的是键值对(方法声 明,方法实现)。由于类的多态性,父类的方法可能被子类所覆盖,这时以上通 过遍历所得的方法列表中就会出现重复的方法对象,维护该表可以很自然地达到 避免方法重复生成的目的,这就维护该表的原因所在。 生成代理类的构造函数 相信读者依然清晰记得代理类是通过其构造函数反射生成的,而构造时传入 的唯一参数就是调用处理器对象。为了保持与原代理机制的一致性,新的代理类 的构造函数也同样只有一个调用处理器对象作为参数。模板简单如下 清单 6. 构造函数模板
需要特别提一下的是 super 方法的参数值列表 &Parameters 的生成, 我们借鉴了 Mock 思想,侧重于追求对象构造的成功,而并未过多地努力分析并 寻求最准确最有意义的赋值。对此,相信读者会多少产生一些疑虑,但稍后我们 会提及改进的方法,请先继续阅读。 生成整个代理类 通过以上步骤,构造函数和所有需被代理的方法的代码已经生成,接下来就 是生成整个代理类的时候了。这个过程也很直观,通过获取相关信息并对类模板 中各个标签位进行替换,便可以轻松的完成整个代理类的代码生成。 Java动态代理机制分析及扩展,第2部分(5)时间:2011-06-21 IBM / 王忠平 何平被遗忘的角落:类变量 等等,似乎遗忘了什么?从调用者的角度出发,我们希望代理类能够作为被 代理类的如实代表呈现在用户面前,包括其内部状态,而这些状态通常是由类变 量所体现出来的,于是就涉及到类变量的代理问题。 要解决这个问题,首先需要思考何时两者的类变量可能出现不一致?回答了 这个问题,也就找到了解决思路。回顾代理类的构造函数,我们以粗糙的方式构 造了代理类实例。它们可能一开始就已经不一致了。还有每次方法调用也可能导 致被两者的类变量的不一致。如何解决?直观的想法是:1)构造时需设法进行 同步;2)方法调用之前和之后也需设法进行同步。这样,我们就能够有效避免 代理类和被代理类的类变量不一致的问题的出现了。 但是,如何获得被代理类的实例呢?从当前的的设计中已经没有办法做到。 既然如此,那就继续我们的扩展之旅。只不过这次扩展的对象是调用处理器接口 ,我们将在扩展后的接口里加入获取被代理类对象的方法,且扩展调用处理器接 口将以 static 和 public 的形式被定义在 ProxyEx 类中。 清单 7. ProxyEx 类内的静态接口 InvocationHandlerEx
新的调用处理器接口具备了获取被代理类对象的能力,从而为实现类变量的 同步打开了通道。接下来还需要的就是执行类变量同步的 sync 方法,每个动态 生成的代理类中都会被悄悄地加入这个私有方法以供调用。每次方法被分派转发 到调用处理器执行之前和之后,sync 方法都会被调用,从而保证类变量的双向 实时更新。相应的,方法模板也需要更新以支持该新特性。 清单 8. 更新后的方法模板(部分)
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |