W rzeczywistości różnią się pod względem miejsca, w którym można ich używać. A.class
działa w czasie kompilacji, podczas gdy a.getClass()
wymaga wystąpienia typu A
i działa w czasie wykonywania.
Może również wystąpić różnica w wydajności. While A.class
może zostać rozwiązany przez kompilator, ponieważ zna rzeczywisty typ A
, a.getClass()
jest wywołaniem metody wirtualnej w czasie wykonywania.
Dla porównania kompilator przeznaczony dla kodu bajtowego zazwyczaj emituje następujące instrukcje dotyczące Integer.getClass()
:
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
oraz następujące dla Integer.class
:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
Pierwsza z nich wymagałaby zazwyczaj wysyłania metody wirtualnej i dlatego prawdopodobnie wykonanie jej zajęłoby więcej czasu. To jednak ostatecznie zależy od JVM.
A.class.getClass()
?