2015-07-02 43 views
0

我有一個從Map<String, byte[]>加載類的CustomClassLoader。我正在加載的類取決於其他的卸載類。我已經包含在在CustomClassLoader之前發起的UrlClassLoader說類的jar文件,但是當CustomClassLoader試圖加載具有外部進口(在URLClassLoader的一個jar文件)拋出一個異常類:跨類加載器的類加載

Exception in thread "main" java.lang.NoClassDefFoundError: external/class/in/urlclassloader/ClassImportedByLoadedClass 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642) 
    at CustomClassLoader.defineClass(EncryptedByteArrayClassLoader.java:35) 

我需要一些方法來或者:

一)所有負載是在URLClassLoader

b中的類)有一些方法來設置URLClassLoader的作爲正在從內存(而不是我的CustomClassLoader)加載類的默認的ClassLoader

線35:

public Class<?> defineClass(String name, byte[] bytes) { 
    return super.defineClass(name, bytes, 0, bytes.length); 
} 

我已經嘗試設置上下文ClassLoader,如:

Thread.currentThread().setContextClassLoader(jarLoader); 

jarLoader是URLClassLoader

有什麼辦法來完成我想要做什麼?

回答

2

您應該重寫ClassLoader(ClassLoader parent)構造在CustomClassLoader並通過您URLClassLoader有:

class CustomClassLoader extends ClassLoader { 
    public CustomClassLoader(URLClassLoader parent, ...your data...) { 
     super(parent); 
     ... 
    } 
} 

CustomClassLoader customClassLoader = new CustomClassLoader(jarLoader, ...); 
+0

完美工作,謝謝! – user1497561