Java Hướng dẫn API phản chiếu với ví dụ
⚡ Tóm tắt thông minh
Java API phản chiếu phân tích và sửa đổi các khả năng của một lớp trong thời gian chạy, bao gồm các trường, phương thức và hàm tạo của nó. Tài liệu này giải thích về gói java.lang.reflect, các phương thức chính của java.lang.Class và bốn ví dụ đọc siêu dữ liệu của một lớp, biến, phương thức và hàm tạo.
Sự phản ánh trong là gì Java?
Java Phản chiếu (Reflection) là quá trình phân tích và sửa đổi tất cả các khả năng của một lớp trong thời gian chạy. API Phản chiếu trong Java Được sử dụng để thao tác với một lớp và các thành viên của nó, bao gồm các trường, phương thức, hàm tạo, v.v., trong thời gian chạy.
Một ưu điểm của API phản chiếu là ở Java Điều đó có nghĩa là nó cũng có thể thao túng các thành viên riêng tư của lớp.
Gói java.lang.reflect cung cấp nhiều lớp để triển khai tính năng phản chiếu. Các phương thức của lớp java.lang.Class được sử dụng để thu thập toàn bộ siêu dữ liệu của một lớp cụ thể.
Lớp trong gói java.lang.reflect
Sau đây là danh sách khác nhau Java các lớp học trong gói java.lang.reflect để triển khai tính năng phản chiếu:
- Cánh đồng: Lớp này được sử dụng để thu thập thông tin khai báo như kiểu dữ liệu, bổ ngữ truy cập, tên và giá trị của một biến.
- Phương pháp: Lớp này được sử dụng để thu thập thông tin khai báo như bổ ngữ truy cập, kiểu trả về, tên, kiểu tham số và kiểu ngoại lệ của một phương thức.
- xây dựng: Lớp này được sử dụng để thu thập thông tin khai báo như bổ ngữ truy cập, tên và kiểu tham số của hàm tạo.
- Bổ nghĩa: Lớp này được sử dụng để thu thập thông tin về một công cụ sửa đổi quyền truy cập cụ thể.
Các phương thức được sử dụng trong java.lang.Class
- public String getName(): Trả về tên của lớp.
- public Class getSuperclass(): Trả về tham chiếu đến lớp cha.
- public Class[] getInterfaces(): Trả về một mảng các giao diện được triển khai bởi lớp được chỉ định.
- public int getModifiers(): Trả về một giá trị số nguyên biểu thị các bổ ngữ của lớp được chỉ định, giá trị này cần được truyền làm tham số cho phương thức “public static String toString(int i)” để trả về bộ chỉ định truy cập cho lớp đã cho.
Làm thế nào để có được thông tin đầy đủ về một lớp học
Để có được thông tin về biếnĐể khai báo các phương thức và hàm tạo của một lớp, chúng ta cần tạo một đối tượng của lớp đó. Ví dụ sau đây minh họa các cách khác nhau để tạo một đối tượng của lớp “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; } }
Ví dụ 1: Cách lấy siêu dữ liệu của lớp
Ví dụ sau đây minh họa cách lấy siêu dữ liệu như tên lớp, tên lớp cha, các giao diện đã triển khai và các bổ ngữ truy cập của một lớp.
Chúng ta sẽ lấy siêu dữ liệu của lớp có tên bên dưới. Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- Tên của lớp học là: Guru99cơ sở
- Các thuộc tính truy cập của nó là: public và abstract
- Nó đã triển khai các giao diện: Serializable và Cloneable
- Vì nó không kế thừa bất kỳ lớp nào một cách rõ ràng, nên lớp cha của nó là: java.lang.Object
Lớp bên dưới sẽ lấy siêu dữ liệu của GuruMở tệp 99Base.class và in nó ra:
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)); } }
- In ra tên của lớp bằng cách sử dụng phương thức getName().
- In ra tên của lớp cha bằng cách sử dụng phương thức getSuperclass().getName().
- In ra tên của các giao diện đã được triển khai.
- In ra các bổ ngữ truy cập được lớp sử dụng.
Ví dụ 2: Cách lấy siêu dữ liệu của biến
Ví dụ sau đây minh họa cách lấy siêu dữ liệu của một biến.
Ở đây, chúng ta đang tạo một lớp có tên là GuruLớp 99VariableMetaData.class với một số biến:
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"; }
Các bước để lấy siêu dữ liệu về các biến trong lớp trên:
- Tạo đối tượng lớp của lớp trên, tức là, GuruLớp 99VariableMetaData.class, như bên dưới:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Lấy siêu dữ liệu dưới dạng mảng trường bằng cách sử dụng getFields() or getDeclaredFields() các phương pháp như sau:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
getFields() Phương thức này trả về siêu dữ liệu của các biến công khai từ lớp được chỉ định cũng như từ lớp cha của nó.
getDeclaredFields() Phương thức này chỉ trả về siêu dữ liệu của tất cả các biến thuộc lớp được chỉ định.
- Lấy tên của các biến bằng cách sử dụng phương thức “public String getName()”.
- Lấy kiểu dữ liệu của các biến bằng cách sử dụng phương thức “public Class getType()”.
- Lấy giá trị của biến bằng cách sử dụng phương thức “public xxx get(Field)”. Ở đây, xxx có thể là một byte, short, hoặc bất kỳ loại giá trị nào mà chúng ta muốn lấy.
- Lấy các bổ ngữ truy cập của các biến bằng cách sử dụng các phương thức getModifiers() và Modifier.toString(int i).
Ở đây, chúng ta đang viết một lớp để lấy siêu dữ liệu của các biến có trong lớp đó. 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(); } } }
- Đã tạo một đối tượng lớp cho Guru99VariableMetaData.class.
- Đã lấy toàn bộ siêu dữ liệu của các biến trong một mảng Field.
- In ra tất cả tên biến trong lớp. Guru99VariableMetaData.class.
- In ra tất cả các kiểu dữ liệu của các biến trong lớp.
- In ra tất cả các bổ ngữ truy cập của các biến trong lớp.
- In ra giá trị của tất cả các biến trong lớp.
Ví dụ 3: Cách lấy siêu dữ liệu của phương thức
Ví dụ sau đây minh họa cách lấy siêu dữ liệu của một phương thức.
Ở đây, chúng ta đang tạo một lớp có tên là GuruLớp 99MethodMetaData.class với một số phương thức:
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"); } }
Các bước để lấy siêu dữ liệu về các phương thức trong lớp trên:
- Tạo đối tượng lớp của lớp trên, tức là, Guru99MethodMetaData.class, như bên dưới:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Lấy thông tin về các phương thức trong một mảng Method bằng cách sử dụng các phương thức getMethods() và getDeclaredMethods() như sau:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
getMethods() Phương thức này trả về siêu dữ liệu của các phương thức công khai từ lớp được chỉ định cũng như từ lớp cha của nó. getDeclaredMethods() Phương thức này chỉ trả về siêu dữ liệu của tất cả các phương thức thuộc lớp được chỉ định.
- Lấy tên của phương thức bằng cách sử dụng getName () phương pháp.
- Lấy kiểu trả về của phương thức bằng cách sử dụng getReturnType() phương pháp.
- Lấy các công cụ sửa đổi quyền truy cập của các phương thức bằng cách sử dụng getModifier() và Modifier.toString(int i) phương pháp.
- Lấy kiểu tham số phương thức bằng cách sử dụng getParameterTypes() phương thức này trả về một mảng Class.
- Nhận các ngoại lệ được ném ra khi sử dụng getExceptionTypes() phương thức này trả về một mảng Class.
Ở đây, chúng ta đang viết một lớp để lấy siêu dữ liệu của các phương thức có trong lớp đó. 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(); } } }
- Đã tạo một đối tượng lớp cho Guru99MethodMetaData.class.
- Đã lấy toàn bộ siêu dữ liệu của tất cả các phương thức vào một mảng Method.
- In ra tất cả tên phương thức có trong lớp.
- In ra kiểu dữ liệu trả về của các phương thức trong lớp.
- In ra tất cả các bổ ngữ truy cập của các phương thức trong lớp.
- In ra kiểu tham số của các phương thức.
- In ra các ngoại lệ do các phương thức ném ra.
Ví dụ 4: Cách lấy siêu dữ liệu của các hàm tạo
Ví dụ sau đây minh họa cách lấy siêu dữ liệu của các hàm tạo.
Ở đây, chúng ta đang tạo một lớp có tên là GuruLớp 99Constructor.class với các hàm tạo khác nhau:
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 { } }
Ở đây, chúng ta đang viết một lớp để lấy siêu dữ liệu của các hàm tạo có trong lớp đó. 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(); } } }
- Đã tạo một đối tượng lớp cho Guru99Constructor.class.
- Đã lấy toàn bộ siêu dữ liệu của tất cả các hàm tạo vào một mảng Constructor.
- In ra tất cả tên của các hàm tạo có trong lớp.
- In ra tất cả các bổ ngữ truy cập của các hàm tạo trong lớp.
- In ra kiểu dữ liệu tham số của các hàm tạo.
- In ra các ngoại lệ do hàm tạo ném ra.

















