Chúng thực sự khác nhau về nơi bạn có thể sử dụng chúng. A.class
hoạt động tại thời điểm biên dịch trong khi a.getClass()
yêu cầu một thể hiện của kiểu A
và hoạt động trong thời gian chạy.
Có thể có sự khác biệt về hiệu suất. Trong khi A.class
có thể được giải quyết bởi trình biên dịch vì nó biết loại thực tế của A
, a.getClass()
là một cuộc gọi phương thức ảo xảy ra trong thời gian chạy.
Để tham khảo, mã bytecode nhắm mục tiêu của trình biên dịch thường phát ra các hướng dẫn sau cho Integer.getClass()
:
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
và những điều sau đây cho Integer.class
:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
Trước đây thường liên quan đến việc gửi phương thức ảo và do đó có lẽ mất nhiều thời gian hơn để thực thi. Tuy nhiên, điều đó cuối cùng phụ thuộc vào JVM.
A.class.getClass()
?