7

クラスローダーに関していくつか質問があります。

Class.forName("class.name");

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

それぞれの場合にどのクラスローダーが使用されますか?最初のケースでは、メソッドコードが実行されているクラスをロードするために使用されたクラスローダーを想定しています。そして2番目のケースでは、スレッドコンテキストクラスローダーを想定しています。

私が間違っている場合は、簡単な説明をいただければ幸いです。

4

1 に答える 1

3

どちらも現在のを使用し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

現在のClassLoadersun.misc.Launcher.AppClassLoader)がクラスのロードに使用されたことを示します。

于 2012-07-27T08:42:09.933 に答える