快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
被创建      cache.put(key, pendingGenerationMarker);      // break 跳出循环已进入创建过程      break; } while (true);

动态创建代理类的类对象。首先是确定代理类所在的包,其原则如前所述, 如果都为 public 接口,则包名为空字符串表示顶层包;如果所有非 public 接 口都在同一个包,则包名与这些接口的包名相同;如果有多个非 public 接口且 不同包,则抛异常终止代理类的生成。确定了包后,就开始生成代理类的类名, 同样如前所述按格式“$ProxyN”生成。类名也确定了,接下来就是见证奇迹的 发生 —— 动态生成代理类:

清单 10. 动态生成代理类

// 动态地生成代理类的字节码数组 byte[] proxyClassFile = ProxyGenerator.generateProxyClass(  proxyName, interfaces); try {    // 动态地定义新生成的代理类    proxyClass = defineClass0(loader, proxyName,  proxyClassFile, 0,      proxyClassFile.length); } catch (ClassFormatError e) {    throw new IllegalArgumentException(e.toString()); } // 把生成的代理类的类对象记录进 proxyClasses 表 proxyClasses.put(proxyClass, null);

由此可见,所有的代码生成的工作都由神秘的 ProxyGenerator 所完成了, 当你尝试去探索这个类时,你所能获得的信息仅仅是它位于并未公开的 sun.misc 包,有若干常量、变量和方法以完成这个神奇的代码生成的过程,但 是 sun 并没有提供源代码以供研读。至于动态类的定义,则由 Proxy 的 native 静态方法 defineClass0 执行。

代码生成过程进入结尾部分,根据结果更新缓存表,如果成功则将代理类的 类对象引用更新进缓存表,否则清楚缓存表中对应关键值,最后唤醒所有可能的 正在等待的线程。

走完了以上四个步骤后,至此,所有的代理类生成细节都已介绍完毕,剩下 的静态方法如 getInvocationHandler 和 isProxyClass 就显得如此的直观,只 需通过查询相关变量就可以完成,所以对其的代码分析就省略了。

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

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

代理类实现推演

分析了 Proxy 类的源代码,相信在读者的脑海中会对 Java 动态代理机制形 成一个更加清晰的理解,但是,当探索之旅在 sun.misc.ProxyGenerator 类处 嘎然而止,所有的神秘都汇聚于此时,相信不少读者也会对这个 ProxyGenerator 类产生有类似的疑惑:它到底做了什么呢?它是如何生成动态 代理类的代码的呢?诚然,这里也无法给出确切的答案。还是让我们带着这些疑 惑,一起开始探索之旅吧。

事物往往不像其看起来的复杂,需要的是我们能够化繁为简,这样也许就能 有更多拨云见日的机会。抛开所有想象中的未知而复杂的神秘因素,如果让我们 用最简单的方法去实现一个代理类,唯一的要求是同样结合调用处理器实施方法 的分派转发,您的第一反应将是什么呢?“听起来似乎并不是很复杂”。的确, 掐指算算所涉及的工作无非包括几个反射调用,以及对原始类型数据的装箱或拆 箱过程,其他的似乎都已经水到渠成。非常地好,让我们整理一下思绪,一起来 完成一次完整的推演过程吧。

清单 11. 代理类中方法调用的分派转发推演实现

// 假设需代理接口 Simulator  public interface Simulator {    short simulate(int arg1, long arg2, String arg3) throws  ExceptionA, ExceptionB; } // 假设代理类为 SimulatorProxy, 其类声明将如下 final public class SimulatorProxy implements Simulator  {    // 调用处理器对象的引用    protected InvocationHandler handler;    // 以调用处理

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