2015-07-02 94 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