为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Helenr 2019-05-31 11:06:31
如何在运行时动态加载JAR?为什么在Java中这么难呢?如果您想拥有任何类型的模块系统,则需要能够动态加载JAR。我听说有办法写你自己的ClassLoader但是,对于一些应该(至少在我看来)应该像调用一个包含JAR文件的方法一样简单的方法来说,这需要做大量的工作。对于这样做的简单代码有什么建议吗?
查看完整描述

4 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

困难的原因是安全。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);

很痛苦,但就是这样。


查看完整回答
反对 回复 2019-05-31
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

下面的解决方案是恶意的,因为它使用反射绕过封装,但是它工作得完美无缺:


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);


查看完整回答
反对 回复 2019-05-31
?
慕后森

TA贡献1802条经验 获得超5个赞

你应该看看OSGi,例如在月食平台。它就是这么做的。您可以安装、卸载、启动和停止所谓的包,这实际上是JAR文件。但是它做得更多,因为它提供了例如可以在运行时在JAR文件中动态发现的服务。

的规范。Java模块系统.


查看完整回答
反对 回复 2019-05-31
  • 4 回答
  • 0 关注
  • 1202 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信