Java动态代理机制分析及扩展,第1部分 - 编程入门网
被创建
cache.put(key, pendingGenerationMarker);
// break 跳出循环已进入创建过程
break;
} while (true);
动态创建代理类的类对象。首先是确定代理类所在的包,其原则如前所述, 如果都为 public 接口,则包名为空字符串表示顶层包;如果所有非 public 接 口都在同一个包,则包名与这些接口的包名相同;如果有多个非 public 接口且 不同包,则抛异常终止代理类的生成。确定了包后,就开始生成代理类的类名, 同样如前所述按格式“$ProxyN”生成。类名也确定了,接下来就是见证奇迹的 发生 —— 动态生成代理类: 清单 10. 动态生成代理类
由此可见,所有的代码生成的工作都由神秘的 ProxyGenerator 所完成了, 当你尝试去探索这个类时,你所能获得的信息仅仅是它位于并未公开的 sun.misc 包,有若干常量、变量和方法以完成这个神奇的代码生成的过程,但 是 sun 并没有提供源代码以供研读。至于动态类的定义,则由 Proxy 的 native 静态方法 defineClass0 执行。 代码生成过程进入结尾部分,根据结果更新缓存表,如果成功则将代理类的 类对象引用更新进缓存表,否则清楚缓存表中对应关键值,最后唤醒所有可能的 正在等待的线程。 走完了以上四个步骤后,至此,所有的代理类生成细节都已介绍完毕,剩下 的静态方法如 getInvocationHandler 和 isProxyClass 就显得如此的直观,只 需通过查询相关变量就可以完成,所以对其的代码分析就省略了。 Java动态代理机制分析及扩展,第1部分(6)时间:2011-06-21 IBM / 王忠平 何平代理类实现推演 分析了 Proxy 类的源代码,相信在读者的脑海中会对 Java 动态代理机制形 成一个更加清晰的理解,但是,当探索之旅在 sun.misc.ProxyGenerator 类处 嘎然而止,所有的神秘都汇聚于此时,相信不少读者也会对这个 ProxyGenerator 类产生有类似的疑惑:它到底做了什么呢?它是如何生成动态 代理类的代码的呢?诚然,这里也无法给出确切的答案。还是让我们带着这些疑 惑,一起开始探索之旅吧。 事物往往不像其看起来的复杂,需要的是我们能够化繁为简,这样也许就能 有更多拨云见日的机会。抛开所有想象中的未知而复杂的神秘因素,如果让我们 用最简单的方法去实现一个代理类,唯一的要求是同样结合调用处理器实施方法 的分派转发,您的第一反应将是什么呢?“听起来似乎并不是很复杂”。的确, 掐指算算所涉及的工作无非包括几个反射调用,以及对原始类型数据的装箱或拆 箱过程,其他的似乎都已经水到渠成。非常地好,让我们整理一下思绪,一起来 完成一次完整的推演过程吧。 清单 11. 代理类中方法调用的分派转发推演实现
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |