我想创建一个类加载器,通过几个第三方 jar 扩展类路径。目前我的代码如下所示:
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader originalClassLoader = Main.class.getClassLoader();
URL[] jarUrls = ...;
ClassLoader customClassLoader = URLClassLoader.newInstance(jarUrls, originalClassLoader);
Class classFromJar = customClassLoader.loadClass("class.from.Jar");
originalClassLoader.equals(classFromJar.getClassLoader()); // true
customClassLoader.equals(classFromJar.getClassLoader()); // false
// I want classFromJar.getClassLoader() to return customClassLoader
}
}
问题是即使类加载使用ClassLoader#loadClass
工作正常,#getClassLoader
加载类的方法返回原始类加载器而不是自定义类加载器。这种状态会导致调用喜欢classFromJar.newInstance()
抛出ClassNotFoundExeption
,因为originalClassLoader
不知道额外的 jar,因此classFromJar
无法加载依赖项。
如何使自定义类加载器将自身传播到Class#getClassLoader
已加载类的结果?
我想纯粹在运行时实现这一点,而不需要自定义“java.class.path”系统属性或 JVM-Djava.system.class.loader
开关。