1

Class.forName("ClassName") と ClassObject.getClass の両方がクラスのランタイム インスタンスを返すかどうかを理解したいと思います。次に、2 つから取得した結果の Class オブジェクトを比較すると、ブール型の false が取得されるのはなぜですか (== または equals を使用して比較した場合)。
また、クラス名で呼び出される .class メソッドの正確な使用法を知りたいです。コンパイル時などに決定されることを読みましたが、その目的は何ですか。Class.forName("ClassName") で十分ではありませんか??
ありがとう

4

2 に答える 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ため、最後は降伏していることに注意してください。BAgetClass()Bb

于 2012-09-09T08:06:24.537 に答える
1

Class.forNameクラスをロードして初期化します。obj.getClass()permgenにロードされたクラスオブジェクトを返します。クラスが同じクラスローダーによってロードされる場合、==trueを返す必要があります。false==比較が表示されている場合、それはそれらが異なるクラスローダーによってロードされていることを意味します。

于 2012-09-09T08:05:39.570 に答える