使用什么类加载器?

mic*_*nko 6 java classloader contextclassloader

关于班级装载机,我有几个问题.

Class.forName("class.name");
Run Code Online (Sandbox Code Playgroud)

....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
Run Code Online (Sandbox Code Playgroud)

在每种情况下将使用哪些类加载器?对于第一种情况,我假设用于加载方法代码正在执行的类的类加载器.在第二种情况下,我假设线程上下文类加载器.

如果我错了,我会很感激.

Uli*_*Uli 3

两者都使用当前的ClassLoader. 正如 DNA 正确指出的那样,http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29声明Class.forName()使用当前的类加载器。一个小实验表明,使用该语句加载实例化的类new也使用当前的ClassLoader

public class Test
{
    public static void main(String[] args) throws Exception
    {
        Thread.currentThread().setContextClassLoader(new MyClassLoader());
        SomeClass someClass = new SomeClass();
        someClass.printClassLoader();
    }

    public static class MyClassLoader extends ClassLoader
    {
        public MyClassLoader()
        {
            super();
        }

        public MyClassLoader(ClassLoader parent)
        {
            super(parent);
        }
    }
}



public class SomeClass
{
    public void printClassLoader()
    {
        System.out.println(this.getClass().getClassLoader());
        System.out.println(Thread.currentThread().getContextClassLoader());
    }
}
Run Code Online (Sandbox Code Playgroud)

我们Test将当前线程的 ContextClassLoader 设置为一些自定义的ClassLoader,然后实例化一个 class 的对象SomeClass。我们SomeClass打印出当前线程的 ContextClassLoader 和ClassLoader加载该对象的类的 ContextClassLoader 。结果是

sun.misc.Launcher$AppClassLoader@3326b249
test.Test$MyClassLoader@3d4b7453
Run Code Online (Sandbox Code Playgroud)

表明当前ClassLoader( sun.misc.Launcher.AppClassLoader)用于加载该类。