繁体   English   中英

使用什么类加载器?

[英]what class loader is used?

关于类加载器,我有几个问题。

Class.forName("class.name");

....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....

在每种情况下将使用哪种装载机? 对于第一种情况,我假设使用了类加载器来加载在其中执行方法代码的类。 在第二种情况下,我假设线程上下文类加载器。

万一我错了,不胜感激。

两者都使用当前的ClassLoader 正如DNA正确指出的那样, http : Class.forName()指出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());
    }
}

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

sun.misc.Launcher$AppClassLoader@3326b249
test.Test$MyClassLoader@3d4b7453

指示当前的ClassLoadersun.misc.Launcher.AppClassLoader )用于加载类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM