快速业务通道

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

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

java test.Test arg1 arg2 arg3

您相应地要通过如下命令使用 Run 类来运行应用程序:

java Run test.Test arg1 arg2 arg3

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

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

拦截类加载

就其本身而言,清单 1 中短小的 Run 类不是非常有用。为了实现拦截类加载过程的目标 ,我们需要采取进一步的动作,对应用程序类定义和使用我们自己的 classloader。

正如我们在第 1 部分中讨论的,classloader 使用一个树状层次结构。每个 classloader(JVM 用于核心 Java 类的根 classloader 除外)都具有一个父 classloader 。Classloader 应该在独自加载类之前检查它们的父 classloader,以防止当某个层次结构 中的多个 classloader 加载同一个类时可能引发的冲突。首先检查父 classloader 的过程 称为 委托――classloader 将加载类的责任委托给最接近根的 classloader,后者能够访问 要加载类的信息。

当 清单 1 中的 Run 程序开始执行时,它已经被 JVM 默认的 System classloader(您 定义的 classpath 所指定的那一个)加载了。为了符合类加载的委托规则,我们需要对相同 的父 classloader 使用完全相同的 classpath 信息和委托,从而使我们的 classloader 成 为 System classloader 的真正替代者。幸运的是,JVM 当前用于 System classloader 实 现的 java.net.URLClassLoader 类提供了一种检索 classpath 信息的容易途径,它使用了 getURLs() 方法。为了编写 classloader,我们只需从 java.net.URLClassLoader 派生子类 ,并初始化基类以使用相同的 classpath 和父 classloader 作为加载主类的 System classloader。清单 2 提供了这种方法的具体实现:

清单 2. 一个详细的 classloader

public class VerboseLoader extends URLClassLoader {    protected VerboseLoader(URL[] urls, ClassLoader parent) {      super(urls, parent);    }    public Class loadClass(String name)      throws ClassNotFoundException {      System.out.println("loadClass: " + name);      return super.loadClass(name);    }    protected Class findClass(String name)      throws ClassNotFoundException {      Class clas = super.findClass(name);      System.out.println("findclass: loaded " + name +        " from this loader");      return clas;    }    public static void main(String[] args) {      if (args.length >= 1) {        try {          // get paths to be used for loading          ClassLoader base =            ClassLoader.getSystemClassLoader();          URL[] urls;          if (base instanceof URLClassLoader) {            urls = ((URLClassLoader)base).getURLs();          } else {            urls = new URL[]              { new File(".").toURI().toURL() };          }          // list the paths actually being used           System.out.println("Loading from paths:");          for (int i = 0; i < urls.length; i++) {            System.out.println(" " + urls[i]);          }          // load target class 

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