ContextClassLoader没有挂钩

Jim*_*Jim 5 java

我正在尝试定义一个自定义的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)

问题是我的线条永远不会打印出来.显然我错过了一些东西.

Bal*_*usC 6

这与bug 4868493有关.这是一个相关的引用:

不幸的是,文件getContextClassLoadersetContextClassLoader可能导致一个按预期的方式提交的代码应工作的结论.

但是,类加载中有一个基本规则 - 没有类可以自动加载一个"下游"的类,即不能由该类ClassLoader或其祖先之一 直接加载ClassLoaders.

这在许多地方都有描述.例如,冥想这里提供的白皮书:http: //www.javageeks.com/Papers/ClassForName/index.html 获得启发.

关键点似乎是Java语言不会自动使用上下文类加载器.它只是存储上下文类加载器的传统位置,以便其他类可以使用 3参数形式Class.forName.

规范Thread.getContextClassLoaderThread.setContextClassLoader 应该澄清,并且应该澄清"上下文类加载器"的含义.重新归类为doc bug.

该规范尚未澄清.

为了让它按照您最初的要求工作,请替换new RandomClass()

Class.forName(RandomClass.class.getName(), 
              true,
              getContextClassLoader()).newInstance();
Run Code Online (Sandbox Code Playgroud)

这反映了以下内容:

This never gets printed

  • 他们使用`ClassLoader#loadClass()`."ClassLoader"实例以这种方式存储并以线程传递.查看源代码的一个很好的起点是`org.apache.catalina.core.DefaultInstanceManager`. (2认同)