2011-12-28 16 views
0

この2つのJava文は同じようにクラスを検索しますか?JavaこのクラスローダとclassForName

this.getClass().getClassLoader().loadClass("Foo"); 

Class.forName("Foo"); 
+1

[Class.forName()とClassLoader.loadClass()の重複が可能 - 動的読み込みに使用する?](http://stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-ダイナミックローディングのために使用する) –

+0

** "ルックアップ" **によって、クラスをロードすることを意味しますか? –

+0

ルックアップとは、クラスをロードしようとしているソースを意味します。 –

答えて

3

彼らはさまざまだ:彼らは同じクラスローダを使用していても(forName()documentationを参照)forName()はないながらloadClass()が静的​​初期化子を実行しません。

これは、簡単に次のクラスで実証されています。それはdoesnのloadStuff()に偽渡す実行中

public class ClassA { 
    static { 
    System.out.println("ClassA static initializer"); 
    } 

    public ClassA() {} 
} 

public class ClassB { 
    private ClassB() {} 

    private void loadStuff(boolean initialize) throws ClassNotFoundException { 
    if (initialize) { 
     Class.forName("ClassA"); 
    } else { 
     this.getClass().getClassLoader().loadClass("ClassA"); 
    } 
    } 

    public static void main(String[] args) throws ClassNotFoundException { 
    ClassB b = new ClassB(); 
    b.loadStuff(true); // Try also false 
    } 
} 

loadStuff()にtrueを渡すClassBを実行するには」 "にClassA静的初期化子" と表示されます何も表示しない。

もちろん、ロードされたクラスをインスタンス化すると、静的初期化子はまだ実行されていない場合に実行されます。この場合、クラスをロードする2つの方法の違いは、静的初期化子が実行されるときです。

関連する問題