เมนู

การสะท้อน Java เป็นเรื่องง่าย

สารบัญ

การสะท้อน 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...ใช้เป็นภาพสะท้อนในคลาสที่แสดงถึงซอฟต์แวร์เสรี

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

System.out.println(“>>> กรณีปกติ”);
FreeSoft freeSoft = FreeSoft ใหม่();
freeSoft.setName(“แชท&เมสเซนเจอร์ แชทและเมสเซนเจอร์!!”);
freeSoft.showName();
freeSoft.showPrice(0);

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

System.out.println(“>>> เมื่อใช้การสะท้อน”);
//สร้างอินสแตนซ์ของคลาส 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

ซอร์สโค้ด BeanUtil

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