Java 如何使用自定义类加载器?

Java 如何使用自定义类加载器?,java,classloader,Java,Classloader,大家好,谢谢大家的关注!我有一个问题,必须既简单又明显,但我被卡住了 我希望通过自定义类加载器交付动态创建的Java类,供第三方库使用 现在我的问题是:当我自己不直接加载这些类时,如何设置自定义类加载器来加载这些类 我想,当我使用我的类加载器加载某个类时,它就变成了这个类的类加载器,从该类加载的所有类都将通过我的类加载器传递 根据以下官方教程,我创建了一个自定义类加载器: 现在我的问题是,当我调用第三方库类的findSystemClass(name)时,父类加载器会找到这个类(因为它在类路径上)

大家好,谢谢大家的关注!我有一个问题,必须既简单又明显,但我被卡住了

我希望通过自定义类加载器交付动态创建的Java类,供第三方库使用

现在我的问题是:当我自己不直接加载这些类时,如何设置自定义类加载器来加载这些类

我想,当我使用我的类加载器加载某个类时,它就变成了这个类的类加载器,从该类加载的所有类都将通过我的类加载器传递

根据以下官方教程,我创建了一个自定义类加载器:

现在我的问题是,当我调用第三方库类的
findSystemClass(name)
时,父类加载器会找到这个类(因为它在类路径上),并成为它的类加载器。由于父类加载器不知道我的自定义类加载器,它实际上已经停止使用,
this.getClass().getClassLoader()
无法转换为DynamicClassLoader

另一种方法是通过JVM参数
-Djava.system.class.loader=my.DynamicClassloader
将我的类加载器设置为系统类加载器。但这给了我一个StackOverflower错误:

    ...
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.findSystemClass(ClassLoader.java:916)
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
    ...

这一定很容易做到,但我现在没有主意了。。。非常感谢您的帮助

我不确定我是否理解这个问题,您有一个第三方库,您希望它使用您的类加载器来加载类

如果幸运的话,第三方库使用了threads上下文类加载器,您可以使用
Thread.currentThread().setContextClassLoader(myClassLoader)
设置该类加载器,在同一线程中,您可以使用
Thread.currentThread().getContextClassLoader()
访问该类加载器

另一点,但不确定它在您的上下文中是否重要,就是您还可以编写一个父类last classloader,在委托给父类之前尝试加载该类(而不是尝试先委托)

在您的评论后编辑:

父类\最后一个类加载器将起作用。如果库不依赖线程上下文类加载器,则必须使用父类最后一个类加载器加载库,从而将类加载器设置为库的类加载器,而不是其父类加载器(类加载器的父类)

您也可以使用父级优先行为创建类加载器,但对于您的第三方库


ContextClassLoader是个好主意,我们将尝试一下。谢谢!至于最后一个类加载器:我不认为这会有什么不同。实际上,我不想定义我正在加载的类,我只希望我的类加载器是当前的类加载器,因此所有对
findClass
的后续调用都通过它传递…如何编写父类加载器?是否存在现有的实现?如果不是,那么这不是一个常见的问题,或者有另一个更好的方法来解决它。
ClassLoader thisClassLoader = this.getClass().getClassLoader();
((DynamicClassloader) thisClassLoader).defineClass(className, dynClass);
    ...
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.findSystemClass(ClassLoader.java:916)
at de.unisaarland.cs.st.DynamicClassloader.findClass(DynamicClassloader.java:39)
    ...