เมนู

Java reflection นั้นง่าย

สารบัญ

Java reflection นั้นง่าย

ชวาการสะท้อนส่วนนี้จะแนะนำคลาสยูทิลิตี้ที่ช่วยให้ใช้งาน API ได้ง่ายขึ้น

การสะท้อนคืออะไร?

API การสะท้อนฟัน,"java.lang.reflectมีรวมอยู่ในแพ็คเกจแล้ว
API นี้ใช้สำหรับดึงข้อมูล เช่น ฟิลด์และเมธอดจากคลาส Java
เราจะใช้คลาสต่อไปนี้เป็นหลัก

  • คลาส java.lang
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • ฟิลด์ java.lang.reflect

การสะท้อนด้วยวิธีนี้ คุณสามารถหลีกเลี่ยงการเขียนโค้ดสร้างคลาสและการเรียกใช้เมธอดโดยตรงได้
คุณสามารถสร้างอินสแตนซ์ของคลาสและเรียกใช้เมธอดจากสตริงได้

การกำหนดชื่อคลาสและชื่อเมธอดในไฟล์ภายนอก เช่น XML ช่วยให้แอปพลิเคชันสามารถปรับเปลี่ยนได้อย่างไดนามิกตามการเปลี่ยนแปลงในสภาพแวดล้อมการทำงาน
นอกจากนี้ ยังเป็น API ที่มีประสิทธิภาพสูงมากสำหรับการสร้างแอปพลิเคชันที่มีความยืดหยุ่นสูง


จุดประสงค์ของการไตร่ตรอง

การสะท้อนแม้ว่าผู้ใช้จะไม่ได้ใช้งานโดยตรงบ่อยนักก็ตาม
มีการใช้งานอย่างแพร่หลายในแอปพลิเคชันบนเว็บ เช่น Struts และในเฟรมเวิร์กต่างๆ เช่น O/R mapping

ตัวอย่างเช่น เมื่อคุณต้องการตั้งค่าข้อมูลที่ป้อนจากหน้าจอเว็บลงในคุณสมบัติของ JavaBeans โดยอัตโนมัติ
ตัวอย่างเช่น จะใช้ในการออกคำสั่ง SQL เพื่ออัปเดตคุณสมบัติของ JavaBeans โดยอัตโนมัติ

นอกจากนี้ ยังมีฟีเจอร์ต่างๆ เช่น การโหลดและลงทะเบียนปลั๊กอินแบบไดนามิก ซึ่งจะช่วยเพิ่มฟังก์ชันการทำงานของแอปพลิเคชันเมื่อเริ่มต้นทำงานการสะท้อนสิ่งนี้สามารถทำได้ง่ายๆ โดยใช้ [วิธีการนี้]

กำลังดำเนินการตัวอย่าง

ตอนนี้ โปรดลองรันโค้ดตัวอย่างและสัมผัสประสบการณ์การเขียนโปรแกรมโดยใช้เฟรมเวิร์กด้วยตัวคุณเอง

ในที่นี้เราจะใช้คลาสต่อไปนี้การสะท้อนนี่คือวิธีการใช้งานยูทิลิตี้อย่างง่าย

เมน.จาวา...คลาสที่จะดำเนินการ
BeanUtil.java...คลาสยูทิลิตี้การสะท้อน
ฟรีซอฟต์.จาวา...นี่คือคลาสที่แสดงถึงซอฟต์แวร์โอเพนซอร์สและใช้เป็นเครื่องมือสะท้อนความคิด

●เมื่อดำเนินการตามปกติ

ระบบ.เอาต์.ปริ้นท์ล(“">>>กรณีปกติ"”);
FreeSoft freeSoft = new FreeSoft();
ฟรีซอฟต์.ตั้งค่าชื่อ(แชทและส่งข้อความ - มีแชทและส่งข้อความด้วย!!)“);
freeSoft.showName();
freeSoft.showPrice(0);

●เมื่อดำเนินการโดยใช้การสะท้อน (reflection)

ระบบ.เอาต์.พรินต์ลน(เมื่อใช้การสะท้อน)“);
// สร้างอินสแตนซ์ของคลาส FreeSoft
Object invokeObject = BeanUtil.newInstance("ฟรีซอฟต์")“);
// กำหนดค่าให้กับช่องชื่อ
BeanUtil.setProperty(invokeObject, “"ชื่อ"” , “"แชทและส่งข้อความ - แชทและส่งข้อความได้ด้วย!!"”);
// เรียกใช้เมธอด showName() ของ FreeSoft
BeanUtil.invoke(invokeObject, “แสดงชื่อ”, โมฆะ);
// เรียกใช้เมธอด showPrice() ของ FreeSoft
// หากเมธอดมีอาร์กิวเมนต์ จะต้องส่งอาร์กิวเมนต์เหล่านั้นเป็นอาร์เรย์ของชนิด Object
BeanUtil.invoke(invokeObject, “แสดงราคา”,new Object[]{new Integer(0)});

●ผลลัพธ์การดำเนินการ

ผลลัพธ์ของการดำเนินการจะเหมือนกันไม่ว่าคุณจะใช้ Reflection หรือไม่ก็ตาม

>>>กรณีปกติ

ชื่อซอฟต์แวร์: Chat&Messenger โปรแกรมแชทและส่งข้อความ!

ราคา: 0 เยน

>>>เมื่อใช้การสะท้อน

ชื่อซอฟต์แวร์: Chat&Messenger โปรแกรมแชทและส่งข้อความ!

ราคา: 0 เยน

รายละเอียดวิธีการ BeanUtil

อินสแตนซ์ใหม่

วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(String className) โยนข้อยกเว้น
ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากสตริง "className"

พารามิเตอร์:
ชื่อคลาส - ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วน
ค่าที่ส่งคืน:
อินสแตนซ์ใหม่ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
ข้อยกเว้น:
ข้อยกเว้น

อินสแตนซ์ใหม่

วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(String className, Object[] argObj) โยนข้อยกเว้น
ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากสตริง "className"

พารามิเตอร์:
ชื่อคลาส - ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วน
อาร์กออบเจ – อาร์กิวเมนต์ของคอนสตรัคเตอร์
ค่าที่ส่งคืน:
อินสแตนซ์ใหม่ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
ข้อยกเว้น:
ข้อยกเว้น

อินสแตนซ์ใหม่

วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(คลาส clazz) โยนข้อยกเว้น
ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"

พารามิเตอร์:
คลาซซ์ - ระดับ
ค่าที่ส่งคืน:
คลาสใหม่
ข้อยกเว้น:
ข้อยกเว้น

อินสแตนซ์ใหม่

วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(คลาส clazz, Object[] argObj) โยนข้อยกเว้น
ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"

พารามิเตอร์:
คลาซซ์ - ระดับ
อาร์กออบเจ – อาร์กิวเมนต์ของคอนสตรัคเตอร์
ค่าที่ส่งคืน:
คลาสใหม่
ข้อยกเว้น:
ข้อยกเว้น

ตั้งค่าคุณสมบัติ

สาธารณะ คงที่ ว่างเปล่า ตั้งค่าคุณสมบัติ(Object invokeObject, String fieldName, Object value) โยนข้อยกเว้น
มีการเรียกเมธอด setter ของฟิลด์ "fieldName" ของอ็อบเจ็กต์ "invokeObject" เพื่อเก็บค่า "value"

หากไม่มีเมธอด setter ค่าจะถูกกำหนดให้กับฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็น public

พารามิเตอร์:
เรียกใช้ออบเจ็กต์ - วัตถุที่จะถูกประมวลผล
ชื่อฟิลด์ – ชื่อคุณสมบัติของวัตถุที่จะถูกดำเนินการ
ที่แนะนำ – ค่าที่จะตั้งค่า
ข้อยกเว้น:
ข้อยกเว้น – เกิดข้อยกเว้นดังต่อไปนี้:
InvocationTargetException - เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาด
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง – อ็อบเจ็กต์ Method นี้เป็นของ Java
หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้
NosuchMethodException - หากไม่พบเมธอดที่มีชื่อตามที่ระบุ

รับคุณสมบัติ

วัตถุสาธารณะคงที่ รับคุณสมบัติ(Object invokeObject, String fieldName) โยนข้อยกเว้น
เมธอด getter ของ fieldName ของอ็อบเจ็กต์ invokeObject จะถูกเรียกเพื่อดึงค่าของมัน
หากไม่มีเมธอด getter ค่าจะถูกดึงมาจากฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของพร็อพเพอร์ตี้เป้าหมายจะต้องเป็น public

พารามิเตอร์:
เรียกใช้ออบเจ็กต์ - วัตถุที่จะถูกประมวลผล
ชื่อฟิลด์ – ชื่อคุณสมบัติของวัตถุที่จะถูกดำเนินการ
ค่าที่ส่งคืน:
ค่าที่ส่งคืนจากเมธอด getter
ข้อยกเว้น:
ข้อยกเว้น – เกิดข้อยกเว้นดังต่อไปนี้:
InvocationTargetException - เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาด
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง – อ็อบเจ็กต์ Method นี้เป็นของ Java
หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้
NosuchFieldException - หากไม่พบช่องข้อมูลที่มีชื่อตามที่ระบุ

เรียกใช้

วัตถุสาธารณะคงที่ เรียกใช้(Object invokeObject, String callMethod, Object[] argObjects) โยนข้อยกเว้น InvocationTargetException, IllegalAccessException, NoSuchMethodException
คำสั่งนี้จะเรียกใช้เมธอด "callMethod" ของอ็อบเจ็กต์ "invokeObject"
ถ้ามีค่าส่งคืน สามารถรับค่าดังกล่าวได้ในรูปแบบของอ็อบเจ็กต์

พารามิเตอร์:
เรียกใช้ออบเจ็กต์ - วัตถุที่จะถูกประมวลผล
เรียกเมธอด – ชื่อของเมธอดที่จะถูกเรียกใช้งาน
อาร์กออบเจกต์ – หากมีการส่งอาร์กิวเมนต์ จะส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีการส่งอาร์กิวเมนต์ จะส่งค่า null แทน
ค่าที่ส่งคืน:
ค่าที่ส่งคืนจากการเรียกใช้เมธอด "callMethod"
ข้อยกเว้น:
InvocationTargetException - เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาด
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง – อ็อบเจ็กต์ Method นี้เป็นของ Java
หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้
NosuchMethodException - หากไม่พบเมธอดที่มีชื่อตามที่ระบุ

ค้นหาเมธอด

เมธอดสาธารณะแบบคงที่ ค้นหาเมธอด(Object invokeObject, String callMethod, Object[] argObjects) throws NoSuchMethodException
คำสั่งนี้จะค้นหาเมธอด "callMethod" ของอ็อบเจ็กต์ "invokeObject"

พารามิเตอร์:
เรียกใช้ออบเจ็กต์ - วัตถุที่จะถูกประมวลผล
เรียกเมธอด – ชื่อของเมธอดของอ็อบเจ็กต์ที่จะถูกเรียกใช้งาน
อาร์กออบเจกต์ – หากมีการส่งอาร์กิวเมนต์ จะส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีการส่งอาร์กิวเมนต์ จะส่งค่า null แทน
ค่าที่ส่งคืน:
อ็อบเจ็กต์เมธอดที่ตรงกับเงื่อนไขของอาร์กิวเมนต์ที่ระบุ
ข้อยกเว้น:
NosuchMethodException - หากไม่พบวิธีการที่ตรงกัน หรือหากชื่อเป็น "" หรือ ""

ตั้งค่าฟิลด์

สาธารณะ คงที่ ว่างเปล่า ตั้งค่าฟิลด์(Object invokeObject, String fieldName, Object value) โยนข้อยกเว้น IllegalAccessException, NoSuchFieldException
ค่า "value" จะถูกเก็บไว้ในฟิลด์ชื่อ "fieldName" ของอ็อบเจ็กต์ "invokeObject" ที่จะถูกเรียกใช้งาน

พารามิเตอร์:
เรียกใช้ออบเจ็กต์ - วัตถุที่จะถูกประมวลผล
ชื่อฟิลด์ – ชื่อฟิลด์ของวัตถุที่จะถูกดำเนินการ
ที่แนะนำ – ค่าที่จะตั้งค่า
ข้อยกเว้น:
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง – วัตถุที่ระบุคือฟิลด์พื้นฐาน (หรือคลาสย่อยหรือการใช้งานของฟิลด์นั้น)
หากไม่ใช่ตัวอย่างของคลาสหรืออินเทอร์เฟซที่ประกาศไว้ หรือหากการแปลงค่าล้มเหลว
NosuchFieldException - หากไม่พบช่องข้อมูลที่มีชื่อตามที่ระบุ

รับฟิลด์

วัตถุสาธารณะคงที่ รับฟิลด์(Object invokeObject, String fieldName) โยนข้อยกเว้น IllegalAccessException, NoSuchFieldException
คำสั่งนี้จะดึงค่าของฟิลด์ชื่อ "fieldName" ของอ็อบเจ็กต์ "invokeObject" ที่กำลังถูกเรียกใช้งาน

พารามิเตอร์:
เรียกใช้ออบเจ็กต์ - วัตถุที่จะถูกประมวลผล
ชื่อฟิลด์ – ชื่อฟิลด์ของวัตถุที่จะถูกดำเนินการ
ค่าที่ส่งคืน:
ค่าส่งคืน
ข้อยกเว้น:
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง – วัตถุที่ระบุคือฟิลด์พื้นฐาน (หรือคลาสย่อยหรือการใช้งานของฟิลด์นั้น)
หากไม่ใช่ตัวอย่างของคลาสหรืออินเทอร์เฟซที่ประกาศไว้ หรือหากการแปลงค่าล้มเหลว
NosuchFieldException - หากไม่พบช่องข้อมูลที่มีชื่อตามที่ระบุ

มีฟิลด์

บูลีนคงที่สาธารณะ มีฟิลด์(Object object, String fieldName) โยนข้อยกเว้น
คำสั่งนี้จะตรวจสอบว่าอ็อบเจ็กต์ "object" ได้ประกาศฟิลด์ชื่อ "fieldName" หรือไม่

พารามิเตอร์:
วัตถุ - วัตถุที่จะต้องตรวจสอบ
ชื่อฟิลด์ – ชื่อของพื้นที่ที่จะตรวจสอบ
ค่าที่ส่งคืน:
ถ้าประกาศไว้ จะเป็นความจริง
ข้อยกเว้น:
ข้อยกเว้น

GETALLFields

public static java.util.TreeSet GETALLFields(Object object) โยนข้อยกเว้น
พารามิเตอร์:
วัตถุ
ค่าที่ส่งคืน:
ข้อยกเว้น:
ข้อยกเว้น

getShortClassName

สตริงแบบคงที่สาธารณะ getShortClassName(วัตถุ วัตถุ)
ฟังก์ชันนี้จะดึงชื่อคลาสที่ไม่ระบุคุณสมบัติจากอ็อบเจ็กต์

พารามิเตอร์:
วัตถุ
ค่าที่ส่งคืน:

getShortClassName

สตริงแบบคงที่สาธารณะ getShortClassName(ชื่อคลาสสตริง)
ฟังก์ชันนี้จะดึงชื่อคลาสจากชื่อที่ระบุอย่างครบถ้วน

พารามิเตอร์:
ชื่อคลาส
ค่าที่ส่งคืน:

GETFieldName

สตริงแบบคงที่สาธารณะ GETFieldName(ชื่อเมธอดสตริง)
เปลี่ยนชื่อฟิลด์จากชื่อเมธอด ต้องเป็นไปตามข้อกำหนดของ JavaBeans

พารามิเตอร์:
ชื่อข้อมูล
ค่าที่ส่งคืน:

คลาสมีอยู่จริง

บูลีนคงที่สาธารณะ คลาสมีอยู่จริง(ชื่อคลาสสตริง)
คำสั่งนี้จะตรวจสอบว่าชื่อเต็ม "className" เป็นชื่อคลาสที่มีอยู่จริงหรือไม่

พารามิเตอร์:
ชื่อคลาส
ค่าที่ส่งคืน:

รับคำอธิบายคุณสมบัติ

สาธารณะ static PropertyDescriptor[] รับคำอธิบายคุณสมบัติ(Object object) โยน IntrospectionException
ฟังก์ชันนี้จะส่งคืน PropertyDescriptor ที่เก็บข้อมูลของวัตถุ "object"

พารามิเตอร์:
วัตถุ
ค่าที่ส่งคืน:
ข้อยกเว้น:
java.beans.IntrospectionException

ซอร์สโค้ดของ BeanUtil

  • URL をkoピーしました!
สารบัญ