我想创建一个通过几个第三方jar扩展classpath的类加载器。目前我的代码如下所示:
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
并不了解其他广告,因此classFromJar
的依赖关系无法加载。< / p>
如何让自定义类加载器将其自身传播到加载类的Class#getClassLoader
结果?
我希望纯粹在运行时实现这一点,而无需定制&#34; java.class.path&#34;系统属性或JVM -Djava.system.class.loader
切换。