En realidad, son diferentes con respecto a dónde puede usarlos. A.classfunciona en tiempo de compilación, mientras que a.getClass()requiere una instancia de tipo Ay funciona en tiempo de ejecución.
También puede haber una diferencia de rendimiento. Si bien A.classel 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()?