gpt4 book ai didi

java - 为什么当字面上调用方法时,java不能使用线程上下文类加载器?

转载 作者:行者123 更新时间:2023-11-30 05:13:54 28 4
gpt4 key购买 nike

我编写了一个自定义类加载器“JarClassLoader”,它本身可以正常工作,因为以下测试用例是绿色的:

public void testJarClassLoader() throws Exception
{
JarClassLoader cl = new JarClassLoader();
cl.addURLsByClassPath("lib/a-lot-of-jars.jar|lib/more-jars.jar", "\\|");

Class c = cl.loadClass("com.packagepath.classname");

assertNotNull(c);

System.out.println("Class: "+ c);
}

但是,以下测试用例不起作用:

public void testSetThreadClassLoader() throws Exception
{
JarClassLoader cl = new JarClassLoader();
cl.addURLsByClassPath("lib/a-lot-of-jars.jar|lib/more-jars.jar", "\\|");

Thread t = new Thread() {
public void run()
{
TestCase.assertEquals("com.packagepath.JarClassLoader",
Thread.currentThread().getContextClassLoader().getClass().getName());
//this assertion passed


try
{
Class c = Class.forName("com.packagepath.classname");

//it doesn't work, throws ClassNotFoundException

TestCase.assertNotNull(c);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}

**com.packagepath.classname.methodname("params");**
//it doesn't work, throws java.lang.ClassNotFoundException
}
};

t.setContextClassLoader(cl);
t.start();
}

请注意加注星号的行,当我真正调用方法时,我想使用线程上下文类加载器。

我已经阅读了数十个网页和文档,但没有一个明确告诉我粗体线是否应该起作用。我不明白哪里出了问题。

字面上调用的方法可以使用classloader来加载相应的类吗?如果不能,为什么不能?我需要它工作,因为供应商提供的 jar 中的调用实际上是不使用反射或其他任何东西,并且我必须为不同的线程分配不同的类加载器,以避免供应商 jar 中的名称冲突。

有人可以帮我吗?谢谢一百万!

最佳答案

每个类都使用自己的类加载器链接到其他类。类加载器通常委托(delegate)给它们的父级。您不能更改线程上下文类加载器并期望该类取消链接并重新链接到不同的类。

因此,您需要确保链接的类与链接类位于同一类加载器实例(或父级)中。

关于java - 为什么当字面上调用方法时,java不能使用线程上下文类加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2354075/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com