Вони насправді різні за тим, де ви можете їх використовувати. 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()
?