2014-01-16 67 views
0

我想問一下UrlClassLoaders。我寫了一個主要的.jar文件,效果很好。現在我想讓它能夠從其中一個文件夾加載插件。我寫了它,直到它找到文件夾中的.jar文件,可以列出其內部的類(它們的名稱,路徑)。問題是,當我問他找到類(創建它的一個實例),他們不會找到它從我的主要jar文件這樣inherites類:ClassLoader類依賴(插件)

IN MAIN JAR: 
-class Expansion { ... } 

In a plugin jar: 
-class ExpansionA extends MainJar.Expansion { ... } 

所以,當我問一個的URLClassLoader要解決「ExpansionA」類,它將在插件jar中而不是MainJar中搜索「Expansion」類,並且在插件jar中沒有「Expansion」類,因爲它從MainJar繼承爲一個資源庫...並拋出NoDefFoundForClassError異常,而defineClass方法。我怎麼能告訴他在MainJar上課之後也要檢查一下? (它不僅僅只有一個類,但我希望插件能夠從MainJar繼承任何類)。你能幫我嗎?

回答

0

ClassLoader有第一個加載請求委派給它的父。爲確保您正在創建新的類加載器可以訪問類Expansion你應該在新ClassLoader的家長設置爲您的類ExpansionClassLoader

ClassLoader myLoader=newURLClassLoader(urls, Expansion.class.getClassLoader());

這不僅確保了Expansion類將通過myLoader找到,它也將保證它解析爲相同的運行時類(因爲首先要求父類)。如果插件jar包含類的副本,這很重要。

+0

我明白了!我嘗試過,它的工作原理。謝謝! –