どちらも現在のを使用しClassLoader
ます。DNAが正しく指摘しているように、http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29Class.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
)がクラスのロードに使用されたことを示します。