質問はJavaについてです。タイプのクラスを取得する方法は3つあります(コードはデモンストレーション用のスニペットのコレクションにすぎないことに注意してください)。
Class c1 = Class.forName("com.mypkg.MyClass"); //assumes initialize = true
// - OR -
Class c1 = Class.forName("com.mypkg.MyClass", true/false,
this.getClass().getClassLoader());
Class c2 = com.mypkg.MyClass.class;
// - OR -
import com.mypkg.MyClass;
Class c2 = MyClass.class;
MyClass mc = new MyClass();
Class c3 = mc.getClass();
私の質問は初期化についてです。メソッド1では、ブール引数を使用してクラスを初期化するかどうかを制御できます。メソッド3の場合、オブジェクトが作成されるため、明らかにクラスが初期化されます(右?)。
しかし、方法2はどうですか?.class
クラスがまだ初期化されていない場合、呼び出しはクラスを初期化しますか?
そして、クラスがすでに初期化されているかどうかをプログラムで確認するにはどうすればよいでしょうか。
要約回答:
完全な回答については、受け入れられた解決策とそのコメントを参照してください。これは単なる要約です。
クラスがまだ初期化されていない場合、呼び出しはクラスを初期化.class
しません。メッセージを出力するクラス定義の静的ブロックを使用して、クラスが初期化されているかどうかを確認できます。
元の質問の理由:
のjavadocによるとClass.forName
、「forName( "X")を呼び出すと、Xという名前のクラスが初期化されます。」。また、 initializeClass.forName
と呼ばれるブールパラメータを受け入れる方法を含む2つの方法があります。javadocによると、「クラスは、初期化パラメータがtrueであり、以前に初期化されていない場合にのみ初期化されます。」