การเรียนรู้การสะท้อนกลับของ Java <BR>การสะท้อนที่เรียกว่าสามารถเข้าใจได้ว่าเป็นการดำเนินการรับข้อมูลประเภทวัตถุระหว่างรันไทม์ วิธีการเขียนโปรแกรมแบบดั้งเดิมต้องการให้โปรแกรมเมอร์ตัดสินใจเลือกประเภทที่จะใช้ในขั้นตอนการคอมไพล์ แต่ด้วยความช่วยเหลือจากการไตร่ตรอง โปรแกรมเมอร์สามารถรับข้อมูลนี้แบบไดนามิกและเขียนโค้ดแบบพกพาได้มากขึ้น พูดอย่างเคร่งครัด การสะท้อนกลับไม่ใช่คุณลักษณะของภาษาการเขียนโปรแกรม เนื่องจากกลไกการสะท้อนสามารถนำไปใช้ในภาษาใดก็ได้ แต่หากภาษาการเขียนโปรแกรมนั้นรองรับการสะท้อนกลับ การใช้การสะท้อนกลับจะสะดวกกว่ามาก
1. รับคลาสประเภท <BR>เรารู้ว่าทุกสิ่งใน Java นั้นเป็นอ็อบเจ็กต์ และอ็อบเจ็กต์ที่เราใช้โดยทั่วไปจะสืบทอดโดยตรงหรือโดยอ้อมจากคลาส Object คลาส Object มีเมธอดที่เรียกว่า getClass ซึ่งสามารถใช้เพื่อรับคลาสประเภทของอินสแตนซ์ คลาสประเภทหมายถึงคลาสที่แสดงถึงประเภท เนื่องจากทุกอย่างเป็นวัตถุ และประเภทก็ไม่มีข้อยกเว้น ใน Java คลาสประเภทถูกใช้เพื่อแสดงประเภท คลาสประเภททั้งหมดเป็นตัวอย่างของคลาสคลาส ตัวอย่างเช่น นี่คือโค้ดส่วนต่อไปนี้:
A a = ใหม่ A();
ถ้า(a.getClass()==A.คลาส)
System.out.println("เท่ากับ");
System.out.println("ไม่เท่ากัน");
ผลลัพธ์ที่ได้คือการพิมพ์ "เท่ากัน"
จะเห็นได้ว่า object a เป็น instance ของ A ซึ่งเป็นคลาสหนึ่งของ A ผลลัพธ์ที่ส่งคืนโดยใช้ a.getClass() ในคำสั่ง if จะเป็นคลาส type ของ A อย่างแน่นอน เพื่อแสดงคลาสประเภทเฉพาะใน Java คุณสามารถใช้เมธอด " Type.class" ได้ เนื่องจาก a.getClass() ได้รับคลาสประเภท A ซึ่งก็คือ A.class ดังนั้นผลลัพธ์ของการรันโค้ดด้านบนคือการพิมพ์ "เท่ากับ" หมายเหตุพิเศษคือคลาสประเภทมีการติดต่อกันแบบหนึ่งต่อหนึ่ง คลาสประเภทของคลาสพาเรนต์และคลาสประเภทของคลาสย่อยนั้นแตกต่างกัน ดังนั้น สมมติว่า A เป็นคลาสย่อยของ B โค้ดต่อไปนี้จะได้รับเอาต์พุต "ไม่เท่ากัน":
A a = ใหม่ A();
ถ้า(a.getClass()==B.คลาส)
System.out.println("เท่ากับ");
System.out.println("ไม่เท่ากัน");
ดังนั้น หากคุณรู้จักอินสแตนซ์ คุณสามารถรับคลาสประเภทของออบเจ็กต์นั้นได้โดยใช้เมธอด "getClass()" ของอินสแตนซ์ และหากคุณทราบประเภท คุณก็สามารถรับคลาสประเภทของออบเจ็กต์นั้นได้โดยใช้เมธอด ".class" .
2. รับข้อมูลประเภท <BR>หลังจากได้รับคลาสประเภทแล้ว คุณสามารถเรียกวิธีการบางอย่างเพื่อรับข้อมูลประเภทได้ วิธีการหลักคือ:
getName():String: รับชื่อเต็มของประเภท
getSuperClass():Class: รับคลาสพาเรนต์โดยตรงของประเภทนี้ หากประเภทไม่มีคลาสพาเรนต์โดยตรง ให้คืนค่า null
getInterfaces():Class[]: รับอินเทอร์เฟซทั้งหมดที่นำมาใช้โดยประเภทนี้
isArray():boolean: ตรวจสอบว่าประเภทนั้นเป็นอาร์เรย์หรือไม่
isEnum():boolean: ตรวจสอบว่าประเภทนั้นเป็นประเภทการแจงนับหรือไม่
isInterface():boolean: ตรวจสอบว่าประเภทนั้นเป็นอินเทอร์เฟซหรือไม่
isPrimitive():boolean: ตรวจสอบว่าประเภทนั้นเป็นประเภทพื้นฐานหรือไม่ กล่าวคือ เป็น int, boolean, double เป็นต้น
isAssignableFrom(Class cls):boolean: ตรวจสอบว่าประเภทนี้เป็นคลาสพาเรนต์ (บรรพบุรุษ) หรืออินเทอร์เฟซพาเรนต์ (บรรพบุรุษ) ของประเภท cls
getComponentType():Class: หากประเภทนั้นเป็นอาร์เรย์ จะส่งกลับประเภทส่วนประกอบของอาร์เรย์
นอกจากนี้ การดำเนินการต่างๆ เช่น การแปลงประเภทก็สามารถทำได้เช่นกัน โดยมีวิธีการหลักดังนี้
asSubclass(Class clazz):Class: เปลี่ยนประเภทนี้