快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
using custom class loader          VerboseLoader loader =            new VerboseLoader(urls, base.getParent());          Class clas = loader.loadClass(args[0]);          // invoke "main" method of target class          Class[] ptypes =            new Class[] { args.getClass() };          Method main =            clas.getDeclaredMethod("main", ptypes);          String[] pargs = new String[args.length-1];          System.arraycopy(args, 1, pargs, 0, pargs.length);          Thread.currentThread().            setContextClassLoader(loader);          main.invoke(null, new Object[] { pargs });        } catch ...        }      } else {        System.out.println          ("Usage: VerboseLoader main-class args...");      }    } }

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

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

我们已从 java.net.URLClassLoader 派生了我们自己的 VerboseLoader 类,它列出正在 被加载的所有类,同时指出哪些类是由这个 loader 实例(而不是委托父 classloader)加 载的。这里同样为简洁起见而省略了导入和异常处理语句。

VerboseLoader 类中的前两个方法 loadClass() 和 findClass() 重载了标准的 classloader 方法。 loadClass() 方法分别针对 classloader 请求的每个类作了调用。在 此例中,我们仅让它向控制台打印一条消息,然后调用它的基类版本来执行实际的处理。基 类方法实现了标准 classloader 委托行为,即首先检查父 classloader 是否能够加载所请 求的类,并且仅在父 classloader 无法加载该类时,才尝试使用受保护的 findClass() 方 法来直接加载该类。对于 findClass() 的 VerboseLoader 实现,我们首先调用重载的基类 实现,然后在调用成功(在没有抛出异常的情况下返回)时打印一条消息。

VerboseLoader 的 main() 方法或者从用于包含类的 loader 中获得 classpath URL 的 列表,或者在与不属于 URLClassLoader 的实例的 loader 一起使用的情况下,简单地使用 当前目录作为唯一的 classpath 条目。不管采用哪种方式,它都会列出实际正在使用的路径 ,然后创建 VerboseLoader 类的一个实例,并使用该实例来加载命令行上指定的目标类。该 逻辑的其余部分(即查找和调用目标类的 main() 方法)与 清单 1 中的 Run 代码相同。

清单 3 显示了 VerboseLoader 命令行和输出的一个例子,它用于调用清单 1 中的 Run 应用程序:

清单 3. 清单 2 中的程序的例子输出

[dennis]$ java VerboseLoader Run Loading from paths:   file:/home/dennis/writing/articles/devworks/dynamic/code5/  loadClass: Run loadClass: java.lang.Object findclass: loaded Run from this loader loadClass: java.lang.Throwable loadClass: java.lang.reflect.InvocationTargetException loadClass: java.lang.IllegalAccessException loadClass: java.lang.IllegalArgumentException loadClass: java.lang.NoSuchMethodException loadClass: java.lang.ClassNotFoundException loadClass: java.lang.NoClassDefFoundError loadClass: java.lang.Class loadClass: java.lang.String loadClass: java.lang.System loadClass: java.io.PrintStream Usage: Run main-class ar

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