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