На самом деле они разные в зависимости от того, где вы можете их использовать. A.class
работает во время компиляции, в то время как a.getClass()
требует экземпляра типа A
и работает во время выполнения.
Также может быть разница в производительности. Хотя A.class
компилятор может разрешить его, поскольку он знает фактический тип A
, a.getClass()
это вызов виртуального метода, происходящий во время выполнения.
Для справки, целевой байт-код компилятора обычно выдает следующие инструкции для Integer.getClass()
:
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
и следующее для Integer.class
:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
Первый тип обычно включает отправку виртуального метода и, следовательно, предположительно занимает больше времени для выполнения. Однако это в конечном итоге зависит от JVM.
A.class.getClass()
?