Java บทช่วยสอน Reflection API พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
Java Reflection API วิเคราะห์และแก้ไขความสามารถของคลาสในขณะรันไทม์ รวมถึงฟิลด์ เมธอด และคอนสตรัคเตอร์ เอกสารนี้จะอธิบายแพ็กเกจ java.lang.reflect เมธอดหลักของ java.lang.Class และตัวอย่างสี่ตัวอย่างที่อ่านเมตาเดตาของคลาส ตัวแปร เมธอด และคอนสตรัคเตอร์

การสะท้อนกลับอยู่ในอะไร Java?
Java Reflection คือกระบวนการวิเคราะห์และแก้ไขความสามารถทั้งหมดของคลาสในขณะรันไทม์ API ของ Reflection ใน... Java ใช้สำหรับจัดการคลาสและสมาชิกของคลาส ซึ่งรวมถึงฟิลด์ เมธอด คอนสตรัคเตอร์ ฯลฯ ในระหว่างการทำงานของโปรแกรม
ข้อดีอย่างหนึ่งของ Reflection API คือ Java ข้อดีคือมันสามารถควบคุมสมาชิกส่วนตัวของคลาสได้ด้วยเช่นกัน
แพ็กเกจ java.lang.reflect มีคลาสมากมายที่ใช้สำหรับการสร้าง Reflection เมธอดของคลาส java.lang.Class ใช้สำหรับรวบรวมข้อมูลเมตาที่สมบูรณ์ของคลาสใดคลาสหนึ่ง
คลาสในแพ็คเกจ java.lang.reflect
ต่อไปนี้เป็นรายการของ ต่างๆ Java ชั้นเรียน ในแพ็กเกจ java.lang.reflect เพื่อใช้งาน reflection:
- สนาม: คลาสนี้ใช้สำหรับรวบรวมข้อมูลเชิงประกาศ เช่น ชนิดข้อมูล ตัวแก้ไขการเข้าถึง ชื่อ และค่าของตัวแปร
- วิธีการ: คลาสนี้ใช้สำหรับรวบรวมข้อมูลเชิงประกาศ เช่น ตัวแก้ไขการเข้าถึง ประเภทค่าส่งคืน ชื่อ ประเภทพารามิเตอร์ และประเภทข้อยกเว้นของเมธอด
- นวกรรมิก: คลาสนี้ใช้สำหรับรวบรวมข้อมูลเชิงประกาศ เช่น ตัวแก้ไขการเข้าถึง ชื่อ และประเภทพารามิเตอร์ของคอนสตรัคเตอร์
- ตัวดัดแปลง: คลาสนี้ใช้สำหรับรวบรวมข้อมูลเกี่ยวกับตัวแก้ไขการเข้าถึงเฉพาะตัวหนึ่ง
วิธีการที่ใช้ใน java.lang.Class
- สาธารณะ String getName(): ส่งคืนชื่อของคลาส
- คลาสสาธารณะ getSuperclass(): ส่งคืนค่าอ้างอิงของคลาสแม่
- คลาสสาธารณะ[] รับอินเทอร์เฟซ(): ส่งคืนอาร์เรย์ของอินเทอร์เฟซที่คลาสที่ระบุได้นำไปใช้งาน
- public int getModifiers(): ส่งคืนค่าจำนวนเต็มที่แสดงถึงตัวแก้ไขของคลาสที่ระบุ ซึ่งจำเป็นต้องส่งเป็นพารามิเตอร์ไปยังเมธอด “public static String toString(int i)” ที่ส่งคืนตัวระบุการเข้าถึงสำหรับคลาสที่กำหนด
วิธีรับข้อมูลที่สมบูรณ์เกี่ยวกับชั้นเรียน
เพื่อรับข้อมูลเกี่ยวกับ ตัวแปรนอกเหนือจากเมธอดและคอนสตรัคเตอร์ของคลาสแล้ว เราจำเป็นต้องสร้างอ็อบเจ็กต์ของคลาส ตัวอย่างต่อไปนี้แสดงวิธีการต่างๆ ในการสร้างอ็อบเจ็กต์ของคลาส “Class”:
public class Guru99ClassObjectCreation { public static void main(String[] args) throws ClassNotFoundException { // 1 - By using Class.forName() method Class c1 = Class.forName("Guru99ClassObjectCreation"); // 2 - By using getClass() method Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); // 3 - By using .class Class c3 = Guru99ClassObjectCreation.class; } }
ตัวอย่างที่ 1: วิธีการดึงข้อมูลเมตาของคลาส
ตัวอย่างต่อไปนี้แสดงวิธีการดึงข้อมูลเมตา เช่น ชื่อคลาส ชื่อคลาสแม่ อินเทอร์เฟซที่ใช้งาน และตัวแก้ไขการเข้าถึงของคลาส
เราจะได้รับเมตาเดต้าของคลาสที่มีชื่อว่าด้านล่างนี้ Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- ชื่อของชั้นเรียนคือ: Guru99ฐาน
- ตัวแก้ไขการเข้าถึงคือ: public และ abstract
- มีการใช้งานอินเทอร์เฟซ: Serializable และ Cloneable
- เนื่องจากไม่ได้สืบทอดมาจากคลาสใด ๆ โดยตรง ดังนั้นคลาสแม่ของมันจึงเป็น: java.lang.Object
คลาสด้านล่างนี้จะได้รับเมตาเดตาของ Guru99Base.class แล้วพิมพ์ออกมา:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main(String[] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class<Guru99Base> guru99ClassObj = Guru99Base.class; // Print name of the class System.out.println("Name of the class is : " + guru99ClassObj.getName()); // Print super class name System.out.println("Name of the super class is : " + guru99ClassObj.getSuperclass().getName()); // Get the list of implemented interfaces using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- แสดงชื่อคลาสโดยใช้เมธอด getName()
- แสดงชื่อของคลาสแม่โดยใช้เมธอด getSuperclass().getName()
- แสดงชื่อของอินเทอร์เฟซที่ถูกใช้งาน
- แสดงตัวแก้ไขการเข้าถึงที่คลาสใช้
ตัวอย่างที่ 2: วิธีการดึงข้อมูลเมตาของตัวแปร
ตัวอย่างต่อไปนี้แสดงวิธีการดึงข้อมูลเมตาของตัวแปร
ในที่นี้ เรากำลังสร้างคลาสชื่อ... Guruไฟล์ 99VariableMetaData.class ที่มีตัวแปรบางส่วน:
package guru; public class Guru99VariableMetaData { public static int guru99IntVar1 = 1111; static int guru99IntVar2 = 2222; static String guru99StringVar1 = "guru99.com"; static String guru99StringVar2 = "Learning Reflection API"; }
ขั้นตอนในการรับข้อมูลเมตาเกี่ยวกับตัวแปรในคลาสข้างต้น:
- สร้างอ็อบเจ็กต์คลาสของคลาสข้างต้น กล่าวคือ Guru99VariableMetaData.class ดังต่อไปนี้:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- รับเมตาเดตาในรูปแบบอาร์เรย์ฟิลด์โดยใช้ รับฟิลด์() or getDeclaredFields () วิธีการดังต่อไปนี้:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
การขอ รับฟิลด์() เมธอดนี้จะส่งคืนเมตาเดตาของตัวแปรสาธารณะจากคลาสที่ระบุ รวมถึงจากคลาสแม่ของคลาสนั้นด้วย
การขอ getDeclaredFields () เมธอดนี้จะส่งคืนเมตาเดตาของตัวแปรทั้งหมดจากคลาสที่ระบุเท่านั้น
- รับชื่อของตัวแปรโดยใช้เมธอด “public String getName()”
- รับชนิดข้อมูลของตัวแปรโดยใช้เมธอด “public Class getType()”
- ดึงค่าของตัวแปรโดยใช้เมธอด “public xxx get(Field)” โดยที่ xxx อาจเป็นไบต์ ชอร์ต หรือค่าประเภทใดก็ได้ที่เราต้องการดึงมา
- รับค่าตัวแก้ไขการเข้าถึงของตัวแปรโดยใช้เมธอด getModifiers() และ Modifier.toString(int i)
ในที่นี้ เรากำลังเขียนคลาสเพื่อดึงข้อมูลเมตาของตัวแปรต่างๆ ที่มีอยู่ในคลาส Guru99VariableMetaData.class:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- สร้างอ็อบเจ็กต์คลาสสำหรับ Guru99VariableMetaData.class.
- ได้รับเมตาเดต้าทั้งหมดของตัวแปรในอาร์เรย์ฟิลด์แล้ว
- พิมพ์ชื่อตัวแปรทั้งหมดในคลาส Guru99VariableMetaData.class.
- แสดงชนิดข้อมูลของตัวแปรทั้งหมดในคลาส
- พิมพ์ตัวแก้ไขการเข้าถึงทั้งหมดของตัวแปรในคลาส
- แสดงค่าของตัวแปรทั้งหมดในคลาส
ตัวอย่างที่ 3: วิธีการดึงข้อมูลเมตาของเมธอด
ตัวอย่างต่อไปนี้แสดงวิธีการดึงข้อมูลเมตาของเมธอด
ในที่นี้ เรากำลังสร้างคลาสชื่อ... Guru99MethodMetaData.class พร้อมด้วยเมธอดบางส่วน:
package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void guru99Add(int firstElement, int secondElement, String result) throws ClassNotFoundException, ClassCastException { System.out.println("Demo method for Reflection API"); } public String guru99Search(String searchString) throws ArithmeticException, InterruptedException { System.out.println("Demo method for Reflection API"); return null; } public void guru99Delete(String deleteString) throws SQLException { System.out.println("Demo method for Reflection API"); } }
ขั้นตอนในการดึงข้อมูลเมตาเกี่ยวกับเมธอดในคลาสข้างต้น:
- สร้างอ็อบเจ็กต์คลาสของคลาสข้างต้น กล่าวคือ Guru99MethodMetaData.class ดังต่อไปนี้:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- ดึงข้อมูลเมธอดในอาร์เรย์ Method โดยใช้เมธอด getMethods() และ getDeclaredMethods() ดังต่อไปนี้:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
การขอ รับวิธีการ() เมธอดนี้จะส่งคืนเมตาเดตาของเมธอดสาธารณะจากคลาสที่ระบุ รวมถึงจากคลาสแม่ของมันด้วย getDeclaredMethods () เมธอดนี้จะส่งคืนเมตาเดตาของเมธอดทั้งหมดจากคลาสที่ระบุเท่านั้น
- รับชื่อของเมธอดโดยใช้ getName () วิธี
- รับประเภทค่าส่งคืนของเมธอดโดยใช้ getReturnType() วิธี
- รับตัวแก้ไขการเข้าถึงของเมธอดโดยใช้ รับโมดิฟายเออร์() และ Modifier.toString(int i) วิธีการ
- รับประเภทพารามิเตอร์ของเมธอดโดยใช้ getParameterTypes() เมธอดที่ส่งคืนอาร์เรย์ของคลาส
- รับข้อยกเว้นที่ถูกโยนโดยใช้ getExceptionTypes() เมธอดที่ส่งคืนอาร์เรย์ของคลาส
ในที่นี้ เรากำลังเขียนคลาสเพื่อดึงข้อมูลเมตาของเมธอดต่างๆ ที่มีอยู่ในคลาส Guru99MethodMetaData.class:
package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodMetaDataTest { public static void main(String[] args) { // Create Class object for Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- สร้างอ็อบเจ็กต์คลาสสำหรับ Guru99MethodMetaData.class.
- ได้รับเมตาเดต้าทั้งหมดของทุกเมธอดในอาร์เรย์ Method แล้ว
- แสดงชื่อเมธอดทั้งหมดที่มีอยู่ในคลาส
- แสดงประเภทค่าส่งคืนของเมธอดในคลาส
- พิมพ์ตัวแก้ไขการเข้าถึงทั้งหมดของเมธอดในคลาส
- แสดงประเภทพารามิเตอร์ของเมธอดต่างๆ
- พิมพ์ข้อยกเว้นที่เกิดขึ้นจากเมธอดต่างๆ
ตัวอย่างที่ 4: วิธีการดึงข้อมูลเมตาของคอนสตรัคเตอร์
ตัวอย่างต่อไปนี้แสดงวิธีการดึงข้อมูลเมตาของคอนสตรัคเตอร์
ในที่นี้ เรากำลังสร้างคลาสชื่อ... Guru99Constructor.class ที่มีคอนสตรัคเตอร์ต่างกัน:
package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException, ArithmeticException { } public Guru99Constructor(int no, String name) throws RemoteException, SQLException { } public Guru99Constructor(int no, String name, String address) throws InterruptedException { } }
ในที่นี้ เรากำลังเขียนคลาสเพื่อดึงข้อมูลเมตาของคอนสตรัคเตอร์ที่มีอยู่ในคลาส Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; public class Guru99ConstructorMetaDataTest { public static void main(String[] args) { // Create Class object for Guru99Constructor.class Class guru99Class = Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- สร้างอ็อบเจ็กต์คลาสสำหรับ Guru99Constructor.class.
- ได้รับเมตาเดต้าทั้งหมดของคอนสตรัคเตอร์ทั้งหมดไว้ในอาร์เรย์คอนสตรัคเตอร์แล้ว
- แสดงชื่อของคอนสตรัคเตอร์ทั้งหมดที่มีอยู่ในคลาส
- พิมพ์ตัวแก้ไขการเข้าถึงทั้งหมดของคอนสตรัคเตอร์ในคลาส
- แสดงประเภทพารามิเตอร์ของคอนสตรัคเตอร์
- พิมพ์ข้อยกเว้นที่เกิดขึ้นจากคอนสตรัคเตอร์
















