我正在尝试定义一个自定义的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);
}
}当然还有我测试它的代码:
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();
}
}问题是我的代码行永远不会打印出来。很明显我漏掉了什么。
发布于 2010-08-08 15:39:55
通常,JVM中的所有类加载器都组织在一个层次结构中,这样每个类加载器(除了引导整个JVM的原始类加载器)都有一个父类。当被要求加载一个类时,每个兼容的类加载器都应该首先将加载委托给它的父类,并且只有在父类失败的情况下才尝试定义类。
同样的事情也发生在你的案例中。"RandomClass“将被加载,ContextClassLoader将委托给它的父级,依此类推。其中一个父类加载器能够加载"RandomClass“(RandomClass位于父类的类路径中)。由于这个原因,你的SOP没有出现。
参考下面的文章,虽然有点老,但很好:
http://www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.html?page=1
https://stackoverflow.com/questions/3432976
复制相似问题