Java Reflection ค่อนข้างทรงพลังและมีประโยชน์มาก Java Reflection ทำให้สามารถตรวจสอบคลาสอินเทอร์เฟซฟิลด์และเมธอดที่รันไทม์โดยไม่ทราบชื่อของคลาสเมธอดและวิธีอื่น ๆ ณ เวลารวบรวม นอกจากนี้ยังเป็นไปได้ที่จะยกตัวอย่างวัตถุใหม่เรียกวิธีการและรับ / ตั้งค่าเขตข้อมูลโดยใช้การสะท้อน
ตัวอย่าง Java Reflection อย่างรวดเร็วเพื่อแสดงให้คุณเห็นว่าการใช้การสะท้อนนั้นเป็นอย่างไร:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
ตัวอย่างนี้รับวัตถุคลาจากคลาสที่เรียกว่า MyObject เมื่อใช้คลาสอ็อบเจ็กต์ตัวอย่างจะได้รับรายการเมธอดในคลาสนั้นวนซ้ำเมธอดและพิมพ์ชื่อของคลาสนั้น
วิธีการทำงานทั้งหมดนี้ถูกอธิบายที่นี่อย่างแน่นอน
แก้ไข : หลังจากเกือบ 1 ปีฉันกำลังแก้ไขคำตอบนี้ในขณะที่อ่านเกี่ยวกับการสะท้อนฉันได้ใช้ Reflection อีกสองสามครั้ง
- Spring ใช้การกำหนดค่าถั่วเช่น:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
เมื่อบริบท Spring ประมวลผลองค์ประกอบ <bean> นี้จะใช้ Class.forName (String) กับอาร์กิวเมนต์ "com.example.Foo" เพื่อสร้างอินสแตนซ์ของ Class นั้น
จากนั้นจะใช้การสะท้อนอีกครั้งเพื่อรับตัวตั้งค่าที่เหมาะสมสำหรับองค์ประกอบ <คุณสมบัติ> และตั้งค่าเป็นค่าที่ระบุ
- Junit ใช้ Reflection โดยเฉพาะสำหรับการทดสอบวิธีการส่วนตัว / ที่ได้รับการป้องกัน
สำหรับวิธีการส่วนตัว
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
สำหรับเขตข้อมูลส่วนตัว
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);