Na verdade, eles são diferentes com relação a onde você pode usá-los. A.class
funciona em tempo de compilação, enquanto a.getClass()
requer uma instância do tipo A
e funciona em tempo de execução.
Pode haver uma diferença de desempenho também. Enquanto A.class
pode ser resolvido pelo compilador porque ele conhece o tipo real de A
, a.getClass()
é uma chamada de método virtual acontecendo em tempo de execução.
Para referência, um bytecode direcionado ao compilador normalmente emite as seguintes instruções para Integer.getClass()
:
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
e o seguinte para Integer.class
:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
O primeiro normalmente envolveria um despacho de método virtual e, portanto, presumivelmente levaria mais tempo para executar. No entanto, isso é no final dependente da JVM.
A.class.getClass()
?