亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在運行時動態加載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 關注
  • 1224 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號