2013-01-25 78 views
1

我從動態加載的類動態加載java類時出現問題。從ImageJ插件動態加載類

我的課程是ImageJ插件,它通過classloader動態加載其他模塊。加載引用與ImageJ插件相同包中的某些內容的模塊時,我有NoClassDefFoundError

我究竟做的是:

  1. ImageJ的負載插件(A)
  2. (A)獲得系統類加載器
  3. (A)添加JAR網址類加載器
  4. (A)嘗試在罐子中加載所需的類(B)使用Class.forName

我無法加載類B,因爲我得到一個NoClassDefFoundError由B指向一個在當前類加載器中未找到的類。

我想我需要使用相同的類加載器ImageJ首先加載插件,以便能夠加載我的模塊,仍然可以找到以前由ImageJ加載的jar文件的引用。我想這樣做,而不必重新編譯ImageJ

有沒有辦法解決這個問題,而不必贅述ImageJ代碼或不得不修改它?

僞類例如

package a; 
class A extends PlugInFrame {} 


package a; 
class C extends MyOwnPlugIn {} 

package b; 
import a; 
class B extends C {} 

回答

1

我不知道你是否需要動態加載這些類,但得到A的類加載器

ClassLoader classLoader = A.getClass().getClassLoader() 

然後用它來記住B需要有一個no argument constructor

爲什麼你不建立你建立你的插件jar文件合併B?我創建了一些插件,通常我會添加依賴關係,然後構建包含它所需的所有依賴關係的插件jar文件。

2

最簡單的方法是避免動態加載類,但直接使用它。

如果沒有該方法,最好的方法是確保.jar文件都在ImageJ的插件/文件夾中(或者如果您使用斐濟,非插件.jar文件存在於jar中)並使用ImageJ的插件類加載器:IJ.getClassLoader()。loadClass(「blub」);

請注意,您的第3步是一個很大的禁忌:您不應該添加元素到系統類加載器的類路徑。

還要注意,所有的ImageJ專家都可以通過[email protected],而不是在StackOverflow上發佈。