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の実際の型を知っているため、コンパイラによって解決できます。これは、実行時に発生する仮想メソッド呼び出しです。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 に依存します。
以下の例を見てください
a.getClass()!= A.class、つまり、a は A のインスタンスではなく、A の匿名サブクラスのインスタンスです。
a.getClass()タイプ A のインスタンスが必要です
a.getClassクラス/タイプのインスタンスがあり、その正確なタイプを取得したい場合に使用します。whilea.classは、type利用可能で、そのインスタンスを作成する場合に使用されます。コンパイル時に評価される間、インスタンスの実行時型
も返します。
と のパフォーマンスを考慮すると、は よりもパフォーマンスが優れています 。例 :getClass().classgetClass().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
追加したい違いが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それ以外の場合は、構文を使用します