Na verdade, eles são diferentes com relação a onde você pode usá-los. A.classfunciona em tempo de compilação, enquanto a.getClass()requer uma instância do tipo Ae funciona em tempo de execução.
Pode haver uma diferença de desempenho também. Enquanto A.classpode 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()?