快速业务通道

Java编程的动态性,第5部分: 动态转换类 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
gs...

在此例中,唯一直接由 VerboseLoader 加载的类是 Run 类。 Run 使用的其他所有类都 是核心 Java 类,它们是通过父 classloader 使用委托来加载的。这其中的大多数(如果不 是全部的话)核心类实际上都会在 VerboseLoader 应用程序本身的启动期间加载,因此父 classloader 将只返回一个指向先前创建的 java.lang.Class 实例的引用。

Javassist 拦截

清单 2 中的 VerboseClassloader 展示了拦截类加载的基本过程。为了在加载时修改类 ,我们可以更进一步,向 findClass() 方法添加代码,把二进制类文件当作资源来访问,然 后使用该二进制数据。Javassist 实际上包括了直接完成此类拦截的代码,因此与其进一步 扩充这个例子,我们不如看看如何使用 Javassist 实现。

使用 Javassist 来拦截类加载的过程要依赖我们在 第 4 部分 中使用的相同 javassist.ClassPool 类。在该文中,我们通过名称直接从 ClassPool 请求类,以 javassist.CtClass 实例的形式取回该类的 Javassist 表示。然而,那并不是使用 ClassPool 的唯一方式――Javassist 还以 javassist.Loader 类的形式,提供一个使用 ClassPool 作为其类数据源的 classloader。

为了允许您在加载类时操作它们, ClassPool 使用了一个 Observer 模式。您可以向 ClassPool 的构造函数传递预期的观察者接口(observer interface)的一个实例 javassist.Translator 。每当从 ClassPool 请求一个新的类,它都调用观察者的 onWrite () 方法,这个方法能够在 ClassPool 交付类之前修改该类的表示。

Java编程的动态性,第5部分: 动态转换类(4)

时间:2011-04-09 IBM Dennis M. Sosnoski

javassist.Loader 类包括一个便利的 run() 方法,它加载目标类,并且使用所提供的参 数数组来调用该类的 main() 方法(就像在 清单 1 中一样)。清单 4 展示了如何使用 Javassist 类和这个方法来加载和运行目标应用程序类。这个例子中简单的 javassist.Translator 观察者实现仅只是打印一条关于正在被请求的类的消息。

清单 4. Javassist 应用程序运行器

public class JavassistRun {    public static void main(String[] args) {      if (args.length >= 1) {        try {          // set up class loader with translator          Translator xlat = new VerboseTranslator();          ClassPool pool = ClassPool.getDefault(xlat);          Loader loader = new Loader(pool);          // invoke "main" method of target class          String[] pargs = new String[args.length-1];          System.arraycopy(args, 1, pargs, 0, pargs.length);          loader.run(args[0], pargs);        } catch ...        }      } else {        System.out.println          ("Usage: JavassistRun main-class args...");      }    }    public static class VerboseTranslator implements Translator    {      public void start(ClassPool pool) {}      public void onWrite(ClassPool pool, String cname) {        System.out.println("onWrite called for " + cname);      }    } }

下面是 JavassistRun 命令行和输出的一个例子,其中使用它来调用 清单 1 中的 Run 应用程序。

[dennis]$java -cp .:javassist.jar JavassistRun Run onWrite called for Run Usage: Run main-class args.

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