109

Java では、またはを使用する選択をめぐって、どのような長所/短所が存在しますa.getClass()A.class? どちらも aClass<?>が期待される場所ならどこでも使用できますが、さまざまな状況で両方を使用すると、パフォーマンスやその他の微妙な利点があると思います (Class.forName()ClassLoader.loadClass().

4

7 に答える 7

171

目的が異なり、両者の間で「選択」することはめったにないため、長所と短所の観点からそれらを比較することはしません.

  • a.getClass()の実行時の型を返しますa。つまり、持っている場合A a = new B();はクラスa.getClass()を返しBます。

  • A.class静的Aにクラスに評価され、リフレクションに関連することが多い他の目的に使用されます。

パフォーマンスに関しては、測定可能な違いがあるかもしれませんが、最終的には JVM やコンパイラに依存するため、それについては何も言いません。


この投稿は記事として書き直されましたここ.

于 2012-06-08T11:16:02.110 に答える
34

それらは実際に使用できる場所に関して異なります。タイプのインスタンスA.classを必要とし、実行時に機能しますが、コンパイル時に機能します。a.getClass()A

性能差もあるかもしれません。whileは、A.classの実際の型を知っているため、コンパイラによって解決できます。これは、実行時に発生する仮想メソッド呼び出しです。Aa.getClass()

参考までに、バイトコードを対象とするコンパイラは通常、次の命令を発行しますInteger.getClass()

aload_1
invokevirtual   #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;

および の場合は次のとおりですInteger.class

//const #3 = class  #16;    //  java/lang/Integer

ldc_w   #3; //class java/lang/Integer

前者は通常、仮想メソッドのディスパッチを伴うため、おそらく実行に時間がかかります。ただし、これは最終的には JVM に依存します。

于 2012-06-08T11:16:40.127 に答える
8

以下の例を見てください

a.getClass()!= A.class、つまり、a は A のインスタンスではなく、A の匿名サブクラスのインスタンスです。

a.getClass()タイプ A のインスタンスが必要です

于 2012-06-08T11:17:46.760 に答える
7

a.getClassクラス/タイプのインスタンスがあり、その正確なタイプを取得したい場合に使用します。whilea.classは、type利用可能で、そのインスタンスを作成する場合に使用されます。コンパイル時に評価される間、インスタンスの実行時型
も返します。 と のパフォーマンスを考慮すると、は よりもパフォーマンスが優れています 。例 :getClass().class
getClass().class.classgetClass()

public class PerfomanceClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        long time=System.nanoTime();
        Class class1="String".getClass();
        class1="String".getClass();
        class1="String".getClass();
        class1="String".getClass();

        System.out.println("time (getClass()) :"+(System.nanoTime()-time)+" ns");     


        long time2=System.nanoTime();
        Class class2=String.class;
        class2=String.class;
        class2=String.class;
        class2=String.class;

        System.out.println("time (.class):"+(System.nanoTime()-time2)+" ns");
    }

}

出力:

time (getClass()) : 79410 ns
time (.class)     : 8032 ns
于 2014-06-20T07:09:27.870 に答える
1

追加したい違いが1つあります。以下に示すように、Class オブジェクトを取るスーパー クラスを持つクラス コンストラクターがあるとします。サブクラス オブジェクトが作成されるたびに、サブクラスのクラス オブジェクトをスーパー クラスに渡す必要があります。コンストラクターでインスタンス メソッドを呼び出すことができないため、以下のコードはコンパイルされません。その場合は に置き換えmyObject.getClass()ますMyClass.class。それは完全に実行されます。

Class MyClass
{
    private MyClass myObject = new MyClass();
    public MyClass()
    {
        super(myObject.getClass()); //error line compile time error
    }
}
于 2012-06-08T15:54:49.933 に答える
1

p.getClass()pオブジェクトのインスタンスで、このオブジェクトのランタイム クラスを返しますppコンパイル時にエラーが発生する型にすることはできません。オブジェクトのインスタンスにする必要があります。

// B extends A
A a = new B();
System.out.println(a.getClass());
//output: class B

p.classは表現です。これ.classはクラス構文と呼ばれます。pタイプです。クラス、インターフェイス、または配列の名前、さらにはプリミティブ型の名前にすることもできます。 a.getClass() == B.class.

型が利用可能で、インスタンスがある場合は、getClassメソッドを使用して型の名前を取得できます。.classそれ以外の場合は、構文を使用します

于 2019-08-11T07:04:09.237 に答える