Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时将jar文件添加到类路径而不使用反射技巧_Java_Classloader - Fatal编程技术网

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

Java 在运行时将jar文件添加到类路径而不使用反射技巧,java,classloader,Java,Classloader,有几篇文章介绍了如何通过以下想法在运行时将jar文件添加到类路径: -获取当前系统类路径; -假设它是URLClassLoader; -使用反射为受保护的addURL方法设置访问权限; -使用上述方法将url添加到类路径 以下是一个例子: 由于2和3个步骤,这看起来像“讨厌的黑客” 如何扩展URLClassLoader并将其设置为当前版本?我对类加载器有点困惑,尝试了以下方法: public static void main(String... args) { URLClassLoad

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

以下是一个例子:

由于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,而第二行可以。(顺便问一下,为什么会这样?

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

Ah。。。非常感谢。我忘了。但如果我将第四行更改为:System.out.println(jxl.Workbook.class);-当然,我应该在编译时提供import jxl.*,它在运行时也不起作用。在这种情况下,您需要在类路径中有jxl.Workbook来编译。如果您试图在没有jxl.Workbook的情况下执行,JVM在加载类时会抛出NoClassDefFoundError哦,您是对的,这是另一种错误。我想现在更清楚了。谢谢你的解释!