En realidad, son diferentes con respecto a dónde puede usarlos. A.class
funciona en tiempo de compilación, mientras que a.getClass()
requiere una instancia de tipo A
y funciona en tiempo de ejecución.
También puede haber una diferencia de rendimiento. Si bien A.class
el compilador puede resolverlo porque conoce el tipo real de A
, a.getClass()
hay una llamada a un método virtual en tiempo de ejecución.
Como referencia, un código de bytes de destino del compilador normalmente emite las siguientes instrucciones para Integer.getClass()
:
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
y lo siguiente para Integer.class
:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
El primero normalmente implicaría un envío de método virtual y, por lo tanto, presumiblemente tardaría más en ejecutarse. Sin embargo, al final eso depende de la JVM.
A.class.getClass()
?