[英]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
指示当前的ClassLoader
( sun.misc.Launcher.AppClassLoader
)用于加载类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.