猿问

如何在运行时动态加载JAR?

如何在运行时动态加载JAR?

为什么在Java中这么难呢?如果您想拥有任何类型的模块系统,则需要能够动态加载JAR。我听说有办法写你自己的ClassLoader但是,对于一些应该(至少在我看来)应该像调用一个包含JAR文件的方法一样简单的方法来说,这需要做大量的工作。

对于这样做的简单代码有什么建议吗?


Helenr
浏览 1203回答 4
4回答

宝慕林4294392

困难的原因是安全。Classloaders应该是不可变的;您不应该在运行时随意地向它添加类。实际上,我非常惊讶于系统类加载器的工作。下面是您如何制作自己的子类加载程序: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);

慕后森

你应该看看OSGi,例如在月食平台。它就是这么做的。您可以安装、卸载、启动和停止所谓的包,这实际上是JAR文件。但是它做得更多,因为它提供了例如可以在运行时在JAR文件中动态发现的服务。的规范。Java模块系统.
随时随地看视频慕课网APP

相关分类

Java
我要回答