Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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 包含JAR的JAR中类的替换系统类加载器_Java_Jar_Classloader - Fatal编程技术网

Java 包含JAR的JAR中类的替换系统类加载器

Java 包含JAR的JAR中类的替换系统类加载器,java,jar,classloader,Java,Jar,Classloader,到目前为止,我所看到的定制类加载器的示例涉及对URLClassLoader进行子类化,并使用该特定实例在资源中加载类 我试图寻找替代方法来替换SystemClassLoader,这样就可以为不在类路径中的类查询我的类加载器,但没有成功 我尝试了Thread.currentThread().setContextClassLoader,但似乎不起作用 甚至可能吗?使用java.system.class.loader运行JVM属性: java -Djava.system.class.loader=my

到目前为止,我所看到的定制类加载器的示例涉及对URLClassLoader进行子类化,并使用该特定实例在资源中加载类

我试图寻找替代方法来替换SystemClassLoader,这样就可以为不在类路径中的类查询我的类加载器,但没有成功

我尝试了
Thread.currentThread().setContextClassLoader
,但似乎不起作用


甚至可能吗?

使用
java.system.class.loader运行JVM
属性:

java -Djava.system.class.loader=myClassLoader myApplication

尽管这是一个老问题,但确实有一种方法可以取代系统类加载器。 然而,通过反思,你可能会得到比预期更多的东西

        Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader
        scl.setAccessible(true); // Set accessible
        scl.set(null, new YourClassLoader()); // Update it to your class loader

这应该适用于Oracle JVM。

我正在寻找一种排除修改JVM命令行的解决方案如果要替换系统类加载器,则没有这样的解决方案。您可以在代码中创建专有类加载器并使用它来加载类,但它不是系统类加载器。通常,对于大多数情况,创建专有类加载器是一个足够的解决方案。当您说“以便我的类加载器可以为不在类路径中的类提供咨询”时,您是指正常的系统类,如
java.lang.*
等,还是指加载其他第三方类?第三方类…这当然是一种黑客攻击,取决于可能在java版本之间更改的私有变量,但它允许我在调用System.getClassLoader()来加载类的第三方依赖项中使用一个jar和代码来解决问题。将一个jar的类加载器推到最前面,就完成了这个技巧。@Xyene在我完成工作后-如果我将类加载器放回URLClassLoader.getSystemClassLoader(),应用程序行为会正常吗?@ha9u63ar我想这取决于您的用例;如果您不小心,您的类很可能会出现可见性问题(例如,从系统类加载器加载的类A将无法看到您的类B)。我已经有好几年没有做过这样的事情了,但是把系统加载器放回去可能没有什么好处。@xyen我的一个类在这样使用时出现了链接错误。我认为这个解决方案不适合webapplication,因为Servlet容器将有它自己的类加载器,如果我不能重新建立委托链,我就有麻烦了。