类加载器特技:OSGi代码生成 - 编程入门网
存看起来会是这样:
为了防止保留类加载器带来的内存泄露,我们必须使用弱键和弱值。目标是 不在内存中保持一个已卸载的bundle的类空间。我们必须使用弱值,因为每个映 射项目的值(BridgeClassLoader)都强引用着键(ClassLoader),于是以此方 式否定它的“弱点”。这是WeakHashMap javadoc规定的标准建议。通过使用一 个弱缓存我们避免了跟踪所有的bundle,而且不必对他们的生命周期做出反应。 类加载器特技:OSGi代码生成(5)时间:2011-06-11 infoq 译:曹云飞可见性 好的,我们终于有了自己的外来的桥接类空间。现在我们如何在其中定义我 们的增强类?如前所述问题,defineClass()是 BridgeClassLoader的一个受保 护的方法。我们可以用一个公有方法来覆盖它,但这是粗野的做法。如果做覆盖 ,我们还需要自己编码来检查所请求的增强类是否已经被定义。更好的办法是遵 循类加载器设计的意图。该设计告诉我们应该覆盖findClass(),当findClass() 认为它可以由任意二进制源提供所请求类时会调用defineClass()方法。在 findClass()中我们只依赖所请求的类的名称来做决定。所以我们的 BridgeClassLoade必须自己拿主意: 这是一个对“A$Enhanced”类的请求,所以我必须调用一个叫做"A"的类的增 强类生成器!然后我在生成的字节数组上调用defineClass()方法。然后我返回 一个新的类对象。 这段话中有两个值得注意的地方。 我们为增强类的名称引入了一个文本协议 - 我们可以给我们的类加载器传入数据的单独一项 - 所请求的类的名称的字 符串。同时我们需要传入数据中的两项 - 原始类的名称和一个标志,将其(原 始类)标志为增强类的主语。我们将这两项打包为一个字符串,形式为[目标类 的名称]"$Enhanced"。现在 findClass()可以寻找增强类的标志$Enhanced,如 果存在,则提取出目标类的名称。这样我们引入了我们增强类的命名约定。无论 何时,当我们在堆栈中看到一个类名以$Enhanced结尾,我们知道这是一个动态 生成的类。为了减少与正常类名称冲突的风险,我们将增强类标志做得尽可能特 殊(例如:
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号
增强是按需生成的 - 我们永远不会把一个增强类生成两次。我们继承的loadClass()方法首先会 调用findLoadedClass(),如果失败会调用 parent.loadClass(),只有失败的时 候它才会调用 findClass()。由于我们为名称用了一个严格的协议,保证 findLoadedClass()在第二次请求相同类的增强类时候不会失败。这与桥接类加 载器缓存相结合,我们得到了一个非常有效的方案,我们不会桥接同样的bundle 空间两次,或者生产冗余的增强类。 这里我们必须强调通过反射调用defineClass() |
|||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |