WEB开发网
开发学院软件开发Java Java 编程的动态性,第 5 部分: 动态转换类 阅读

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

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 我们已从 java.net.URLClassLoader 派生了我们自己的 VerboseLoader 类,它列出正在被加载的所有类,Java 编程的动态性,第 5 部分: 动态转换类(5),同时指出哪些类是由这个 loader 实例(而不是委托父 classloader)加载的,这里同样为简洁

我们已从 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 args... 

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:Java 编程 动态性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接