Java では、またはを使用する選択をめぐって、どのような長所/短所が存在しますa.getClass()
かA.class
? どちらも aClass<?>
が期待される場所ならどこでも使用できますが、さまざまな状況で両方を使用すると、パフォーマンスやその他の微妙な利点があると思います (Class.forName()
とClassLoader.loadClass()
.
7 に答える
目的が異なり、両者の間で「選択」することはめったにないため、長所と短所の観点からそれらを比較することはしません.
a.getClass()
の実行時の型を返しますa
。つまり、持っている場合A a = new B();
はクラスa.getClass()
を返しB
ます。A.class
静的A
にクラスに評価され、リフレクションに関連することが多い他の目的に使用されます。
パフォーマンスに関しては、測定可能な違いがあるかもしれませんが、最終的には JVM やコンパイラに依存するため、それについては何も言いません。
この投稿は記事として書き直されましたここ.
それらは実際に使用できる場所に関して異なります。タイプのインスタンスA.class
を必要とし、実行時に機能しますが、コンパイル時に機能します。a.getClass()
A
性能差もあるかもしれません。whileは、A.class
の実際の型を知っているため、コンパイラによって解決できます。これは、実行時に発生する仮想メソッド呼び出しです。A
a.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 に依存します。
以下の例を見てください
a.getClass()!= A.class
、つまり、a は A のインスタンスではなく、A の匿名サブクラスのインスタンスです。
a.getClass()
タイプ A のインスタンスが必要です
a.getClass
クラス/タイプのインスタンスがあり、その正確なタイプを取得したい場合に使用します。whilea.class
は、type
利用可能で、そのインスタンスを作成する場合に使用されます。コンパイル時に評価される間、インスタンスの実行時型
も返します。
と のパフォーマンスを考慮すると、は よりもパフォーマンスが優れています 。例 :getClass()
.class
getClass()
.class
.class
getClass()
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
追加したい違いが1つあります。以下に示すように、Class オブジェクトを取るスーパー クラスを持つクラス コンストラクターがあるとします。サブクラス オブジェクトが作成されるたびに、サブクラスのクラス オブジェクトをスーパー クラスに渡す必要があります。コンストラクターでインスタンス メソッドを呼び出すことができないため、以下のコードはコンパイルされません。その場合は に置き換えmyObject.getClass()
ますMyClass.class
。それは完全に実行されます。
Class MyClass
{
private MyClass myObject = new MyClass();
public MyClass()
{
super(myObject.getClass()); //error line compile time error
}
}
p.getClass()
はp
オブジェクトのインスタンスで、このオブジェクトのランタイム クラスを返しますp
。p
コンパイル時にエラーが発生する型にすることはできません。オブジェクトのインスタンスにする必要があります。
// 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
それ以外の場合は、構文を使用します