この2つのJava文は同じようにクラスを検索しますか?JavaこのクラスローダとclassForName
this.getClass().getClassLoader().loadClass("Foo");
と
Class.forName("Foo");
この2つのJava文は同じようにクラスを検索しますか?JavaこのクラスローダとclassForName
this.getClass().getClassLoader().loadClass("Foo");
と
Class.forName("Foo");
彼らはさまざまだ:彼らは同じクラスローダを使用していても(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つの方法の違いは、静的初期化子が実行されるときです。
ここでは、このトピックに関する興味深い議論があります。 Class.forName() vs ClassLoader.loadClass() - which to use for dynamic loading? に使用-ためのダイナミックロード
これはコメントです。 –
[Class.forName()とClassLoader.loadClass()の重複が可能 - 動的読み込みに使用する?](http://stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-ダイナミックローディングのために使用する) –
** "ルックアップ" **によって、クラスをロードすることを意味しますか? –
ルックアップとは、クラスをロードしようとしているソースを意味します。 –