การสะท้อน Java เป็นเรื่องง่าย
ชวาของการสะท้อนขอแนะนำคลาสยูทิลิตี้ที่ช่วยให้คุณสามารถใช้ API ได้อย่างง่ายดาย
การสะท้อนคืออะไร?
API การสะท้อนฟัน,"java.lang.reflect” รวมอยู่ในแพ็คเกจ
นี่คือ API ที่ดึงข้อมูลเช่นฟิลด์และวิธีการจากคลาส Java
คลาสต่อไปนี้ส่วนใหญ่จะใช้
- java.lang.Class
- java.lang.reflect.Constructor
- java.lang.reflect.Method
- java.lang.reflect.Field
การสะท้อนเมื่อใช้ คุณสามารถสร้างคลาสหรือวิธีการเรียกโดยไม่ต้องเขียนโค้ดโดยตรง
คุณสามารถสร้างอินสแตนซ์คลาสจากสตริงหรือดำเนินการวิธีการได้
ด้วยการเขียนคำจำกัดความของชื่อคลาสและชื่อวิธีการในไฟล์ภายนอก เช่น XML คุณสามารถปรับใช้แอปพลิเคชันแบบไดนามิกให้เข้ากับการเปลี่ยนแปลงในสภาพแวดล้อมระหว่างรันไทม์ได้
นอกจากนี้ยังเป็น API ที่มีประสิทธิภาพมากสำหรับการสร้างแอปพลิเคชันที่มีความยืดหยุ่นสูง
วัตถุประสงค์ของการไตร่ตรอง
การสะท้อนมักไม่ค่อยถูกใช้โดยผู้ใช้โดยตรง
มีการใช้กันอย่างแพร่หลายในเว็บแอปพลิเคชัน เช่น Struts และเฟรมเวิร์ก เช่น การทำแผนที่ O/R
ตัวอย่างเช่น เมื่อตั้งค่าข้อมูลอินพุตหน้าจอเว็บเป็นคุณสมบัติ JavaBeans โดยอัตโนมัติ
ใช้เมื่อออก SQL ที่อัปเดตโดยอัตโนมัติตามคุณสมบัติ JavaBeans
นอกจากนี้ ฟังก์ชันต่างๆ เช่น การโหลดและการลงทะเบียนปลั๊กอินแบบไดนามิกที่ขยายฟังก์ชันการทำงานเมื่อแอปพลิเคชันเริ่มทำงานก็พร้อมใช้งานการสะท้อนสามารถทำได้ง่ายๆ โดยใช้ .
ดำเนินการตัวอย่าง
โปรดเรียกใช้ตัวอย่างและสัมผัสประสบการณ์การเขียนโปรแกรมที่เหมือนกรอบงาน
ที่นี่เราใช้คลาสต่อไปนี้การสะท้อนสาธิตการใช้งานยูทิลิตี้อย่างง่าย
Main.java...คลาสที่จะดำเนินการ
BeanUtil.java...คลาสยูทิลิตี้การสะท้อน
ฟรีซอฟท์.java...ใช้เป็นภาพสะท้อนในคลาสที่แสดงถึงซอฟต์แวร์เสรี
●เมื่อดำเนินการตามปกติ
FreeSoft freeSoft = FreeSoft ใหม่();
freeSoft.setName(“แชท&เมสเซนเจอร์ แชทและเมสเซนเจอร์!!”);
freeSoft.showName();
freeSoft.showPrice(0);
●เมื่อดำเนินการโดยใช้การสะท้อน
//สร้างอินสแตนซ์ของคลาส FreeSoft
วัตถุ invoidObject = BeanUtil.newInstance(“ฟรีซอฟท์”);
//ตั้งค่าในช่องชื่อ
BeanUtil.setProperty (เรียกใช้Object, "ชื่อ" , “แชท&เมสเซนเจอร์ แชทและเมสเซนเจอร์!!”);
// ดำเนินการเมธอด showName() ของ FreeSoft
BeanUtil.invive(เรียกใช้Object, “ชื่อรายการ”, โมฆะ);
// ดำเนินการวิธี showPrice() ของ FreeSoft
// หากเมธอดมีอาร์กิวเมนต์ จะต้องส่งผ่านเป็นอาร์เรย์ประเภทอ็อบเจ็กต์
BeanUtil.invive(เรียกใช้Object, “แสดงราคา”,วัตถุใหม่[]{จำนวนเต็มใหม่(0)});
●ผลการดำเนินการ
ผลลัพธ์การดำเนินการจะเหมือนกันไม่ว่าจะในกรณีปกติหรือเมื่อใช้การสะท้อนกลับ
ชื่อซอฟต์แวร์: Chat&Messenger Chat and Messenger! !
ราคา: 0 เยน
>>> เมื่อใช้การสะท้อน
ชื่อซอฟต์แวร์: Chat&Messenger Chat and Messenger! !
ราคา: 0 เยน
รายละเอียดวิธีการ BeanUtil
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(String className) ส่งข้อยกเว้น
- สร้างและส่งกลับอินสแตนซ์จากสตริง "className"
-
- พารามิเตอร์:
ชื่อคลาส
– ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วน- ค่าส่งคืน:
- อินสแตนซ์ใหม่ของชื่อคลาสแบบเต็ม
- ข้อยกเว้น:
ข้อยกเว้น
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(String className, Object[] argObj) ส่งข้อยกเว้น
- สร้างและส่งกลับอินสแตนซ์จากสตริง "className"
-
- พารามิเตอร์:
ชื่อคลาส
– ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วนหาเรื่องObj
– ข้อโต้แย้งของคอนสตรัคเตอร์- ค่าส่งคืน:
- อินสแตนซ์ใหม่ของชื่อคลาสแบบเต็ม
- ข้อยกเว้น:
ข้อยกเว้น
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(Class clazz) พ่น Exception
- สร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
-
- พารามิเตอร์:
แคลซ
- ระดับ- ค่าส่งคืน:
- ตัวอย่างใหม่ของ clazz
- ข้อยกเว้น:
ข้อยกเว้น
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(Class clazz, Object[] argObj) ส่งข้อยกเว้น
- สร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
-
- พารามิเตอร์:
แคลซ
- ระดับหาเรื่องObj
– ข้อโต้แย้งของคอนสตรัคเตอร์- ค่าส่งคืน:
- ตัวอย่างใหม่ของ clazz
- ข้อยกเว้น:
ข้อยกเว้น
ตั้งค่าคุณสมบัติ
โมฆะคงที่สาธารณะ ตั้งค่าคุณสมบัติ(Object invoidObject, String fieldName, Object value) พ่นข้อยกเว้น
- เรียกเมธอด setter ของฟิลด์ "fieldName" ของอ็อบเจ็กต์ "invoidObject" และเก็บค่า "value"
หากไม่มีวิธี setter ค่าจะถูกตั้งค่าไปที่ฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็นแบบสาธารณะ
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อคุณสมบัติของวัตถุที่จะดำเนินการค่า
– ค่าที่จะกำหนด- ข้อยกเว้น:
ข้อยกเว้น
– มีข้อยกเว้นต่อไปนี้เกิดขึ้นการร้องขอ TargetException
– หากวิธีการพื้นฐานส่งข้อยกเว้นข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– วัตถุเมธอดนี้คือ Java
เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้ไม่มีSuchMethodException
– หากไม่พบวิธีการตามชื่อที่ระบุ
รับคุณสมบัติ
วัตถุคงที่สาธารณะ รับคุณสมบัติ(Object invoidObject, String fieldName) ส่งข้อยกเว้น
- เรียกเมธอด getter ของฟิลด์ fieldName ของอ็อบเจ็กต์ invoidObject เพื่อรับค่า
หากไม่มีเมธอด getter ค่าจะถูกดึงมาจากฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็นแบบสาธารณะ -
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อคุณสมบัติของวัตถุที่จะดำเนินการ- ค่าส่งคืน:
- ค่าส่งคืนวิธี Getter
- ข้อยกเว้น:
ข้อยกเว้น
– มีข้อยกเว้นต่อไปนี้เกิดขึ้นการร้องขอ TargetException
– หากวิธีการพื้นฐานส่งข้อยกเว้นข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– วัตถุเมธอดนี้คือ Java
เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้NoSuchFieldException
– หากไม่พบช่องที่มีชื่อที่ระบุ
วิงวอน
วัตถุคงที่สาธารณะ วิงวอน(Object invoidObject, String callMethod, Object[] argObjects) พ่น InvocationTargetException, IllegalAccessException, NoSuchMethodException
- ดำเนินการเมธอด "callMethod" ของอ็อบเจ็กต์ "invoidObject"
หากมีค่าตอบแทนก็สามารถรับเป็นวัตถุได้ -
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการวิธีการโทร
– ชื่อวิธีดำเนินการargObjects
– หากมีข้อโต้แย้ง ให้ส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีข้อโต้แย้งให้ส่งค่าว่าง- ค่าส่งคืน:
- ส่งคืนค่าของการดำเนินการ "callMethod"
- ข้อยกเว้น:
การร้องขอ TargetException
– หากวิธีการพื้นฐานส่งข้อยกเว้นข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– วัตถุเมธอดนี้คือ Java
เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้ไม่มีSuchMethodException
– หากไม่พบวิธีการตามชื่อที่ระบุ
ค้นหาวิธีการ
วิธีสาธารณะแบบคงที่ ค้นหาวิธีการ(Object invoidObject, String callMethod, Object[] argObjects) พ่น NoSuchMethodException
- ค้นหาวิธีการ 'callMethod' ของวัตถุ 'involveObject'
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการวิธีการโทร
– ชื่อวิธีการของวัตถุที่จะดำเนินการargObjects
– หากมีข้อโต้แย้ง ให้ส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีข้อโต้แย้งให้ส่งค่าว่าง- ค่าส่งคืน:
- วัตถุวิธีการที่ตรงกับเงื่อนไขอาร์กิวเมนต์ที่ระบุ
- ข้อยกเว้น:
ไม่มีSuchMethodException
– หากไม่พบวิธีการจับคู่หรือหากชื่อเป็น “” หรือ “”
setField
โมฆะคงที่สาธารณะ setField(Object invoidObject, String fieldName, Object value) พ่น IllegalAccessException, NoSuchFieldException
- เก็บค่า "value" ไว้ในชื่อฟิลด์ "fieldName" ของออบเจ็กต์ที่จะดำเนินการ "invoidObject"
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อฟิลด์ของวัตถุที่จะดำเนินการค่า
– ค่าที่จะกำหนด- ข้อยกเว้น:
ข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– ฟิลด์ที่ใช้วัตถุที่ระบุ (หรือคลาสย่อยหรือตัวดำเนินการ)
ไม่ใช่อินสแตนซ์ของคลาสหรืออินเทอร์เฟซที่ประกาศ หรือหากการแปลงที่คลายไฟล์ล้มเหลวNoSuchFieldException
– หากไม่พบช่องที่มีชื่อที่ระบุ
getField
วัตถุคงที่สาธารณะ getField(Object invoidObject, String fieldName) พ่น IllegalAccessException, NoSuchFieldException
- รับค่าของชื่อฟิลด์ "fieldName" ของออบเจ็กต์ที่จะดำเนินการ "invoidObject"
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อฟิลด์ของวัตถุที่จะดำเนินการ- ค่าส่งคืน:
- ส่งกลับค่า
- ข้อยกเว้น:
ข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– ฟิลด์ที่ใช้วัตถุที่ระบุ (หรือคลาสย่อยหรือตัวดำเนินการ)
ไม่ใช่อินสแตนซ์ของคลาสหรืออินเทอร์เฟซที่ประกาศ หรือหากการแปลงที่คลายไฟล์ล้มเหลวNoSuchFieldException
– หากไม่พบช่องที่มีชื่อที่ระบุ
มีฟิลด์
บูลีนคงที่สาธารณะ มีฟิลด์(วัตถุวัตถุ ชื่อฟิลด์สตริง) ส่งข้อยกเว้น
- ตรวจสอบว่าวัตถุ 'วัตถุ' ประกาศชื่อฟิลด์ 'fieldName'
-
- พารามิเตอร์:
วัตถุ
– วัตถุที่จะตรวจสอบชื่อฟิลด์
– ชื่อฟิลด์ที่จะตรวจสอบ- ค่าส่งคืน:
- จริงถ้าประกาศ
- ข้อยกเว้น:
ข้อยกเว้น
รับ AllFields
java.util.TreeSet สาธารณะแบบคงที่ รับ AllFields(วัตถุวัตถุ) ส่งข้อยกเว้น
-
- พารามิเตอร์:
วัตถุ
–- ค่าส่งคืน:
- ข้อยกเว้น:
ข้อยกเว้น
getShortClassName
สตริงคงที่สาธารณะ getShortClassName(วัตถุวัตถุ)
- รับชื่อคลาสที่ไม่ผ่านการรับรองจากอ็อบเจ็กต์
-
- พารามิเตอร์:
วัตถุ
–- ค่าส่งคืน:
getShortClassName
สตริงคงที่สาธารณะ getShortClassName(ชื่อคลาสสตริง)
- รับชื่อคลาสจากชื่อแบบเต็ม
-
- พารามิเตอร์:
ชื่อคลาส
–- ค่าส่งคืน:
getFieldName
สตริงคงที่สาธารณะ getFieldName(ชื่อวิธีสตริง)
- เปลี่ยนชื่อฟิลด์จากชื่อวิธีการ ต้องเป็นไปตามแบบแผน JavaBeans
-
- พารามิเตอร์:
ชื่อวิธีการ
–- ค่าส่งคืน:
คือClassExist
บูลีนคงที่สาธารณะ คือClassExist(ชื่อคลาสสตริง)
- ตรวจสอบว่าชื่อแบบเต็ม "className" เป็นชื่อคลาสที่มีอยู่
-
- พารามิเตอร์:
ชื่อคลาส
–- ค่าส่งคืน:
getPropertyDescriptors
PropertyDescriptor คงที่สาธารณะ[] getPropertyDescriptors(วัตถุวัตถุ) พ่น IntrospectionException
- ส่งกลับ PropertyDescriptor ที่เก็บข้อมูลวัตถุสำหรับ "วัตถุ"
-
- พารามิเตอร์:
วัตถุ
–- ค่าส่งคืน:
- ข้อยกเว้น:
java.beans.IntrospectionException