Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使LoadedClass.class.getClassLoader()返回自定义类加载器?_Java_Classloader_Urlclassloader_Dynamic Class Loaders - Fatal编程技术网

Java 如何使LoadedClass.class.getClassLoader()返回自定义类加载器?

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

我想创建一个类加载器,它通过几个第三方JAR扩展类路径。当前我的代码如下所示:

公共类主{
公共静态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()
时返回的类加载器。为了修改它,您必须使用反射,因为它是私有的。请注意:此字段的名称在未来版本中可能会更改,或者与以前的版本相比可能已经更改!我希望这就是你在哪里寻找的!