Java 如何使LoadedClass.class.getClassLoader()返回自定义类加载器?
我想创建一个类加载器,它通过几个第三方JAR扩展类路径。当前我的代码如下所示:Java 如何使LoadedClass.class.getClassLoader()返回自定义类加载器?,java,classloader,urlclassloader,dynamic-class-loaders,Java,Classloader,Urlclassloader,Dynamic Class Loaders,我想创建一个类加载器,它通过几个第三方JAR扩展类路径。当前我的代码如下所示: 公共类主{ 公共静态void main(字符串[]args)引发ClassNotFoundException{ ClassLoader originalClassLoader=Main.class.getClassLoader(); URL[]jarURL=。。。; ClassLoader customClassLoader=URLClassLoader.newInstance(jarURL,originalClas
公共类主{
公共静态void main(字符串[]args)引发ClassNotFoundException{
ClassLoader originalClassLoader=Main.class.getClassLoader();
URL[]jarURL=。。。;
ClassLoader customClassLoader=URLClassLoader.newInstance(jarURL,originalClassLoader);
Class classFromJar=customClassLoader.loadClass(“Class.from.Jar”);
originalClassLoader.equals(classFromJar.getClassLoader());//true
customClassLoader.equals(classFromJar.getClassLoader());//false
//我希望classFromJar.getClassLoader()返回customClassLoader
}
}
问题是,即使使用ClassLoader#loadClass
加载类工作正常,加载类的方法#getClassLoader
返回原始类加载器,而不是自定义类加载器。这种状态会导致像classFromJar.newInstance()
这样的调用抛出ClassNotFoundExeption
,因为originalClassLoader
不知道其他jar,所以无法加载classFromJar
的依赖项
如何使自定义类加载器将自身传播到加载类的Class#getClassLoader
结果?
我希望纯粹在运行时实现这一点,而不必定制“java.class.path”系统属性或JVM
-Djava.system.class.loader
开关。嗯,有趣的问题!据我所知,类ClassLoader
中有一个静态字段,称为scl
,代表系统类加载器,您可以修改它并用自己的类加载器替换它。这是调用类加载器#getSystemClassLoader()
时返回的类加载器。为了修改它,您必须使用反射,因为它是私有的。请注意:此字段的名称在未来版本中可能会更改,或者与以前的版本相比可能已经更改!我希望这就是你在哪里寻找的!嗯,有趣的问题!据我所知,类ClassLoader
中有一个静态字段,称为scl
,代表系统类加载器,您可以修改它并用自己的类加载器替换它。这是调用类加载器#getSystemClassLoader()
时返回的类加载器。为了修改它,您必须使用反射,因为它是私有的。请注意:此字段的名称在未来版本中可能会更改,或者与以前的版本相比可能已经更改!我希望这就是你在哪里寻找的!