Java 在我的自定义类加载器中是否有一种方法可以在我委托超级创建类时将类加载器附加到类?
我有这个堆栈跟踪,这是第一次加载这个类(我对这个类的断点有一个条件) 编译类加载器是我的(即这一个) 我想要以插件的方式加载这个类。getClass.getClassLoader返回CompilingClassLoader。相反,它的类加载器是AppClassLoader 这给插件开发人员带来了很多问题,因为目前的解决方法是线程上下文类加载器。有没有一种方法可以声明编译类加载器加载了它,但将其委托给超级类加载器 顺便说一下,临界线是上面链接中的第111行。我希望该行使用超级类为我创建类,但我希望它看起来像是我创建的类。当调用clazz.getClassLoader()时,返回的类应该返回“my”类加载器。这就解决了一大堆问题 编辑---------------------- 经过进一步调查。编译类加载器非常复杂。您有这些类型的类Java 在我的自定义类加载器中是否有一种方法可以在我委托超级创建类时将类加载器附加到类?,java,classloader,Java,Classloader,我有这个堆栈跟踪,这是第一次加载这个类(我对这个类的断点有一个条件) 编译类加载器是我的(即这一个) 我想要以插件的方式加载这个类。getClass.getClassLoader返回CompilingClassLoader。相反,它的类加载器是AppClassLoader 这给插件开发人员带来了很多问题,因为目前的解决方法是线程上下文类加载器。有没有一种方法可以声明编译类加载器加载了它,但将其委托给超级类加载器 顺便说一下,临界线是上面链接中的第111行。我希望该行使用超级类为我创建类,但我希
- 加载java.lang.*导致了SecurityException,因此我不得不委托它
- 解决这个问题后,当slf4j尝试加载配置时,我从SAXParserFactoryImpl到SAXParserFactoryImpl遇到了ClassCastException
Dean类装入器首先从其父类装入器装入类。您应该能够通过简单地不为类加载器设置父类加载器来解决这个问题,并且自己委托调用
loadClass
一个有效的例子:
public类SomeClass实现可运行{
@凌驾
公开募捐{
System.out.println(“类的类加载器:+getClass().getClassLoader());
System.out.println(“线程的类加载器:+thread.currentThread().getContextClassLoader());
System.out.println(“传递依赖项的类加载器:+SomeDependency.Class.getClassLoader());
}
}
可传递依赖项:
public类SomeDependency{}
测试和类加载器:
import java.net.URL;
导入java.net.URLClassLoader;
公开课考试{
公共静态类CustomClassLoader扩展了URLClassLoader{
类加载器委托;
公共CustomClassLoader(URL[]URL,ClassLoader父级){
超级(URL,空);
代表=家长;
}
@凌驾
公共类loadClass(字符串名称)引发ClassNotFoundException{
试一试{
返回super.loadClass(名称);
}catch(classnotfounde异常){
返回delegate.loadClass(名称);
}
}
}
公共静态void main(字符串…参数)引发异常{
URL位置=SomeClass.class.getProtectionDomain().getCodeSource().getLocation();
CustomClassLoader CustomClassLoader=新CustomClassLoader(新URL[]{location},ClassLoader.getSystemClassLoader());
Class loader for class: com.pkg.Test$CustomClassLoader@4e50df2e
Class loader for thread: com.pkg.Test$CustomClassLoader@4e50df2e
Class loader for transitive dependency: sun.misc.Launcher$AppClassLoader@18b4aac2