在运行时将jar文件添加到类路径而不使用反射技巧

时间:2012-02-02 07:06:47

标签: java classloader

有几篇关于如何在运行时通过以下想法将jar文件添加到classpath的帖子: - 获取当前系统类路径; - 假设它是URLClassLoader; - 使用反射为受保护的addURL方法设置访问权限; - 使用提到的方法将url添加到classpath。

这是一个例子: Adding files to java classpath at runtime

由于有2个和3个步骤,这看起来像是"讨厌的黑客"。

如何扩展URLClassLoader并将其设置为当前?我对类加载器感到困惑,并尝试了以下内容:

public static void main(String... args) {
    URLClassLoader loader = new URLClassLoader(new URL[]{new URL("file:jxl.jar")});
    System.out.println(loader.loadClass("jxl.Workbook"));
    Thread.currentThread().setContextClassLoader(loader);
    System.out.println(Class.forName("jxl.Workbook"));
} // main

我在第四行得到ClassNotFoundException,而第二行正常。 (顺便说一句,为什么会如此?)

1 个答案:

答案 0 :(得分:2)

Class.forName方法使用“定义当前类的类加载器”,而不是线程上下文类加载器。在您的情况下,ClassLoader将使用的Class.forName是加载您的应用程序的{{1}},即system class loader。这是一个在类路径中查找资源的类加载器。