Class.forName("ClassName") と ClassObject.getClass の両方がクラスのランタイム インスタンスを返すかどうかを理解したいと思います。次に、2 つから取得した結果の Class オブジェクトを比較すると、ブール型の false が取得されるのはなぜですか (== または equals を使用して比較した場合)。
また、クラス名で呼び出される .class メソッドの正確な使用法を知りたいです。コンパイル時などに決定されることを読みましたが、その目的は何ですか。Class.forName("ClassName") で十分ではありませんか??
ありがとう
質問する
1786 次
2 に答える
2
はい、それらは同じです-そしてそれらはまったく同じオブジェクトを返します。
例:
public class Tryout {
public static class A {
}
public static class B extends A {
}
public static void main(String[] args) throws Exception {
A a = new A();
A b = new B();
//the same class object, one achieved statically and one dynamically.
System.out.println(a.getClass() == A.class);
//the same class object using forName() to get class name dynamically
System.out.println(Class.forName("Tryout$A") == A.class);
//different class. B is not A!
System.out.println(b.getClass() == A.class);
}
}
降伏します:
true
true
false
静的型は同じですが、動的型はNOTであり、したがって、の動的クラスオブジェクトであるを返すfalse
ため、最後は降伏していることに注意してください。B
A
getClass()
B
b
于 2012-09-09T08:06:24.537 に答える
1
Class.forName
クラスをロードして初期化します。obj.getClass()
permgenにロードされたクラスオブジェクトを返します。クラスが同じクラスローダーによってロードされる場合、==
trueを返す必要があります。false
==比較が表示されている場合、それはそれらが異なるクラスローダーによってロードされていることを意味します。
于 2012-09-09T08:05:39.570 に答える