首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContextClassLoader未挂钩

ContextClassLoader未挂钩
EN

Stack Overflow用户
提问于 2010-08-08 11:44:54
回答 1查看 182关注 0票数 5

我正在尝试定义一个自定义的ClassLoader。

代码语言:javascript
复制
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);
    }
}

当然还有我测试它的代码:

代码语言:javascript
复制
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();
    }
}

问题是我的代码行永远不会打印出来。很明显我漏掉了什么。

EN

回答 1

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3432976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档