如何在运行时动态加载JAR文件?
2022-08-31 04:49:31
为什么在Java中做到这一点如此困难?如果你想有任何类型的模块系统,你需要能够动态加载JAR文件。我被告知有一种方法可以通过编写自己的方法做到这一点,但是对于应该(至少在我看来)像调用具有JAR文件作为其参数的方法一样简单的事情来说,这是很多工作。ClassLoader
对执行此操作的简单代码有什么建议吗?
为什么在Java中做到这一点如此困难?如果你想有任何类型的模块系统,你需要能够动态加载JAR文件。我被告知有一种方法可以通过编写自己的方法做到这一点,但是对于应该(至少在我看来)像调用具有JAR文件作为其参数的方法一样简单的事情来说,这是很多工作。ClassLoader
对执行此操作的简单代码有什么建议吗?
它很难的原因是安全性。类装入器意味着是不可变的;您不应该在运行时随意地向其添加类。实际上,我对与系统类加载器配合使用感到非常惊讶。下面介绍如何创建自己的子类加载器:
URLClassLoader child = new URLClassLoader(
new URL[] {myJar.toURI().toURL()},
this.getClass().getClassLoader()
);
Class classToLoad = Class.forName("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod("myMethod");
Object instance = classToLoad.newInstance();
Object result = method.invoke(instance);
痛苦,但事实就是如此。
以下解决方案是黑客,因为它使用反射来绕过封装,但它可以完美地工作:
File file = ...
URL url = file.toURI().toURL();
URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, url);