我正在尝试定义一个自定义的ClassLoader.
public class ExampleLoader extends ClassLoader
{
public Class<?> findClass(String name) throws ClassNotFoundException
{
System.out.println("This never gets printed");
return super.findClass(name);
}
public Class<?> loadClass(String name, boolean b)
throws ClassNotFoundException
{
System.out.println("This never gets printed");
return super.loadClass(name, b);
}
}
Run Code Online (Sandbox Code Playgroud)
当然我的代码来测试它:
public class Tester
{
public static void main(String[] args)
{
Thread t = new FooThread();
t.setContextClassLoader(new ExampleLoader());
t.start();
}
}
class FooThread extends Thread
{
public void run()
{
new RandomClass();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我的线条永远不会打印出来.显然我错过了一些东西.
这与bug 4868493有关.这是一个相关的引用:
不幸的是,文件
getContextClassLoader和setContextClassLoader可能导致一个按预期的方式提交的代码应工作的结论.但是,类加载中有一个基本规则 - 没有类可以自动加载一个"下游"的类,即不能由该类
ClassLoader或其祖先之一 直接加载ClassLoaders.这在许多地方都有描述.例如,冥想这里提供的白皮书:http: //www.javageeks.com/Papers/ClassForName/index.html 获得启发.
关键点似乎是Java语言不会自动使用上下文类加载器.它只是存储上下文类加载器的传统位置,以便其他类可以使用 3参数形式
Class.forName.规范
Thread.getContextClassLoader和Thread.setContextClassLoader应该澄清,并且应该澄清"上下文类加载器"的含义.重新归类为doc bug.
该规范尚未澄清.
为了让它按照您最初的要求工作,请替换new RandomClass()为
Class.forName(RandomClass.class.getName(),
true,
getContextClassLoader()).newInstance();
Run Code Online (Sandbox Code Playgroud)
这反映了以下内容:
This never gets printed
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |