จริงๆแล้วมันแตกต่างกันไปตามที่ที่คุณสามารถใช้ได้ A.class
ทำงานในเวลาคอมไพล์ในขณะที่a.getClass()
ต้องการอินสแตนซ์ประเภทA
และทำงานที่รันไทม์
อาจมีความแตกต่างด้านประสิทธิภาพเช่นกัน ในขณะA.class
ที่คอมไพลเลอร์สามารถแก้ไขได้เนื่องจากทราบชนิดที่แท้จริงA
แต่a.getClass()
เป็นการเรียกใช้เมธอดเสมือนที่เกิดขึ้นที่รันไทม์
สำหรับการอ้างอิงโดยทั่วไปคอมไพลเลอร์กำหนดเป้าหมาย bytecode จะแสดงคำแนะนำต่อไปนี้สำหรับ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()
?