交叉class加载器class加载
Cross-classloader class loading
我有一个 CustomClassLoader
从 Map<String, byte[]>
加载 classes。我正在加载的 classes 依赖于其他未加载的 classes。我在 CustomClassLoader
之前启动的 UrlClassLoader
中有包含所述 classes 的 jar 文件,但是当 CustomClassLoader
试图加载 class 时有外部导入(UrlClassLoader 中的 jarfile)抛出异常:
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)
我需要一些方法:
a) 加载 URLClassLoader
中的所有 classes
或
b) 有一些方法可以将 URLClassLoader 设置为从内存加载的 classes 的默认类加载器(而不是我的 CustomClassLoader)
第 35 行:
public Class<?> defineClass(String name, byte[] bytes) {
return super.defineClass(name, bytes, 0, bytes.length);
}
我试过将上下文 ClassLoader 设置为:
Thread.currentThread().setContextClassLoader(jarLoader);
其中 jarLoader 是 URLClassLoader
.
有什么方法可以完成我想做的事情吗?
您应该覆盖 CustomClassLoader
中的 ClassLoader(ClassLoader parent)
构造函数并将您的 URLClassLoader
传递到那里:
class CustomClassLoader extends ClassLoader {
public CustomClassLoader(URLClassLoader parent, ...your data...) {
super(parent);
...
}
}
CustomClassLoader customClassLoader = new CustomClassLoader(jarLoader, ...);
我有一个 CustomClassLoader
从 Map<String, byte[]>
加载 classes。我正在加载的 classes 依赖于其他未加载的 classes。我在 CustomClassLoader
之前启动的 UrlClassLoader
中有包含所述 classes 的 jar 文件,但是当 CustomClassLoader
试图加载 class 时有外部导入(UrlClassLoader 中的 jarfile)抛出异常:
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)
我需要一些方法:
a) 加载 URLClassLoader
或
b) 有一些方法可以将 URLClassLoader 设置为从内存加载的 classes 的默认类加载器(而不是我的 CustomClassLoader)
第 35 行:
public Class<?> defineClass(String name, byte[] bytes) {
return super.defineClass(name, bytes, 0, bytes.length);
}
我试过将上下文 ClassLoader 设置为:
Thread.currentThread().setContextClassLoader(jarLoader);
其中 jarLoader 是 URLClassLoader
.
有什么方法可以完成我想做的事情吗?
您应该覆盖 CustomClassLoader
中的 ClassLoader(ClassLoader parent)
构造函数并将您的 URLClassLoader
传递到那里:
class CustomClassLoader extends ClassLoader {
public CustomClassLoader(URLClassLoader parent, ...your data...) {
super(parent);
...
}
}
CustomClassLoader customClassLoader = new CustomClassLoader(jarLoader, ...);