Java编程的动态性,第5部分: 动态转换类 - 编程入门网
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 中的程序的例子输出
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |