我有几个关于类加载器的问题。
Class.forName("class.name");
和
....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
在每种情况下将使用哪些类加载器?对于第一种情况,我假设类加载器用于加载执行方法代码的类。在第二种情况下,我假设线程上下文类加载器。
万一我错了,我们将不胜感激。
我有几个关于类加载器的问题。
Class.forName("class.name");
和
....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
在每种情况下将使用哪些类加载器?对于第一种情况,我假设类加载器用于加载执行方法代码的类。在第二种情况下,我假设线程上下文类加载器。
万一我错了,我们将不胜感激。
两者都使用当前的ClassLoader
. 正如 DNA 正确指出的那样,http ://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29声明Class.forName()
使用当前的类加载器。一个小实验表明,使用该new
语句为实例化加载的类也使用 current 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
) 用于加载类。