Trong hướng dẫn này, chúng ta sẽ học về phản xạ, một tính năng trong lập trình Java cho phép chúng ta kiểm tra và sửa đổi các lớp, phương thức, v.v.
Trong Java, phản chiếu cho phép chúng ta kiểm tra và thao tác các lớp, giao diện, hàm tạo, phương thức và trường tại thời gian chạy.
Có một lớp trong Java được đặt tên Class
là giữ tất cả thông tin về các đối tượng và lớp trong thời gian chạy. Đối tượng của Class có thể được sử dụng để thực hiện phản xạ.
Phản ánh của các lớp Java
Để phản ánh một lớp Java, trước tiên chúng ta cần tạo một đối tượng của Lớp.
Và, bằng cách sử dụng đối tượng, chúng ta có thể gọi các phương thức khác nhau để lấy thông tin về các phương thức, trường và hàm tạo có trong một lớp.
Có ba cách để tạo các đối tượng của Lớp:
1. Sử dụng phương thức forName ()
class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");
Ở đây, forName()
phương thức lấy tên của lớp được phản ánh làm đối số của nó.
2. Sử dụng phương thức getClass ()
// create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();
Ở đây, chúng ta đang sử dụng đối tượng của lớp Dog để tạo một đối tượng của Lớp.
3. Sử dụng phần mở rộng .class
// create an object of Class // to reflect the Dog class Class c = Dog.class;
Bây giờ chúng ta biết cách chúng ta có thể tạo các đối tượng của Class
. Chúng ta có thể sử dụng đối tượng này để lấy thông tin về lớp tương ứng trong thời gian chạy.
Ví dụ: Phản chiếu lớp Java
import java.lang.Class; import java.lang.reflect.*; class Animal ( ) // put this class in different Dog.java file public class Dog extends Animal ( public void display() ( System.out.println("I am a dog."); ) ) // put this in Main.java file class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get name of the class String name = obj.getName(); System.out.println("Name: " + name); // get the access modifier of the class int modifier = obj.getModifiers(); // convert the access modifier to string String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the superclass of Dog Class superClass = obj.getSuperclass(); System.out.println("Superclass: " + superClass.getName()); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Đầu ra
Tên: Dog Modifier: public Superclass: Animal
Trong ví dụ trên, chúng ta đã tạo một lớp cha: Động vật và một lớp con: Chó. Ở đây, chúng tôi đang cố gắng kiểm tra lớp Dog.
Lưu ý tuyên bố,
Class obj = d1.getClass();
Ở đây, chúng ta đang tạo một object obj của Class bằng getClass()
phương thức này. Sử dụng đối tượng, chúng tôi đang gọi các phương thức khác nhau của Lớp.
- obj.getName () - trả về tên của lớp
- obj.getModifiers () - trả về công cụ sửa đổi quyền truy cập của lớp
- obj.getSuperclass () - trả về siêu lớp của lớp
Để tìm hiểu thêm về Class
, hãy truy cập Lớp Java (tài liệu Java chính thức).
Lưu ý : Chúng tôi đang sử dụng Modifier
lớp để chuyển đổi công cụ sửa đổi truy cập số nguyên thành một chuỗi.
Trường phản ánh, phương thức và hàm tạo
Gói java.lang.reflect
cung cấp các lớp có thể được sử dụng để thao tác các thành viên trong lớp. Ví dụ,
- Lớp phương thức - cung cấp thông tin về các phương thức trong một lớp
- Lớp trường - cung cấp thông tin về các trường trong một lớp
- Lớp Constructor - cung cấp thông tin về các constructor trong một lớp
1. Phản ánh các phương thức Java
Các Method
lớp học cung cấp phương pháp khác nhau có thể được sử dụng để thu thập thông tin về các phương pháp hiện diện trong một lớp học. Ví dụ,
import java.lang.Class; import java.lang.reflect.*; class Dog ( // methods of the class public void display() ( System.out.println("I am a dog."); ) private void makeSound() ( System.out.println("Bark Bark"); ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // using object of Class to // get all the declared methods of Dog Method() methods = obj.getDeclaredMethods(); // create an object of the Method class for (Method m : methods) ( // get names of methods System.out.println("Method Name: " + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.println("Modifier: " + Modifier.toString(modifier)); // get the return types of method System.out.println("Return Types: " + m.getReturnType()); System.out.println(" "); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )
Đầu ra
Tên phương thức: hiển thị Công cụ sửa đổi: công khai Các loại trả lại: void Tên phương thức: makeSound Công cụ sửa đổi: riêng tư Các loại trả lại: void
Trong ví dụ trên, chúng tôi đang cố gắng lấy thông tin về các phương thức có trong lớp Dog. Như đã đề cập trước đó, đầu tiên chúng ta đã tạo một object obj Class
bằng cách sử dụng getClass()
phương thức này.
Chú ý biểu thức,
Method() methods = obj.getDeclaredMethod();
Ở đây, getDeclaredMethod()
trả về tất cả các phương thức có bên trong lớp.
Ngoài ra, chúng ta đã tạo một đối tượng m của Method
lớp. Đây,
- m.getName () - trả về tên của một phương thức
- m.getModifiers () - trả về công cụ sửa đổi truy cập của các phương thức ở dạng số nguyên
- m.getReturnType () - trả về kiểu trả về của các phương thức
Các Method
lớp học cũng cung cấp các phương pháp khác nhau có thể được sử dụng để kiểm tra các phương pháp tại thời gian chạy. Để tìm hiểu thêm, hãy truy cập lớp Phương pháp Java (tài liệu Java chính thức).
2. Phản ánh các trường Java
Giống như các phương thức, chúng ta cũng có thể kiểm tra và sửa đổi các trường khác nhau của một lớp bằng cách sử dụng các phương thức của Field
lớp. Ví dụ,
import java.lang.Class; import java.lang.reflect.*; class Dog ( public String type; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access and set the type field Field field1 = obj.getField("type"); field1.set(d1, "labrador"); // get the value of the field type String typeValue = (String) field1.get(d1); System.out.println("Value: " + typeValue); // get the access modifier of the field type int mod = field1.getModifiers(); // convert the modifier to String form String modifier1 = Modifier.toString(mod); System.out.println("Modifier: " + modifier1); System.out.println(" "); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Đầu ra
Giá trị: labrador Modifier: public
Trong ví dụ trên, chúng ta đã tạo một lớp có tên là Dog. Nó bao gồm một trường công khai được đặt tên là loại. Lưu ý tuyên bố,
Field field1 = obj.getField("type");
Here, we are accessing the public field of the Dog class and assigning it to the object field1 of the Field class.
We then used various methods of the Field
class:
- field1.set() - sets the value of the field
- field1.get() - returns the value of field
- field1.getModifiers() - returns the value of the field in integer form
Similarly, we can also access and modify private fields as well. However, the reflection of private field is little bit different than the public field. For example,
import java.lang.Class; import java.lang.reflect.*; class Dog ( private String color; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access the private field color Field field1 = obj.getDeclaredField("color"); // allow modification of the private field field1.setAccessible(true); // set the value of color field1.set(d1, "brown"); // get the value of field color String colorValue = (String) field1.get(d1); System.out.println("Value: " + colorValue); // get the access modifier of color int mod2 = field1.getModifiers(); // convert the access modifier to string String modifier2 = Modifier.toString(mod2); System.out.println("Modifier: " + modifier2); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Output
Value: brown Modifier: private
In the above example, we have created a class named Dog. The class contains a private field named color. Notice the statement.
Field field1 = obj.getDeclaredField("color"); field1.setAccessible(true);
Here, we are accessing color and assigning it to the object field1 of the Field
class. We then used field1 to modify the accessibility of color and allows us to make changes to it.
We then used field1 to perform various operations on the private field color.
To learn more about the different methods of Field, visit Java Field Class (official Java documentation).
3. Reflection of Java Constructor
We can also inspect different constructors of a class using various methods provided by the Constructor
class. For example,
import java.lang.Class; import java.lang.reflect.*; class Dog ( // public constructor without parameter public Dog() ( ) // private constructor with a single parameter private Dog(int age) ( ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get all constructors of Dog Constructor() constructors = obj.getDeclaredConstructors(); for (Constructor c : constructors) ( // get the name of constructors System.out.println("Constructor Name: " + c.getName()); // get the access modifier of constructors // convert it into string form int modifier = c.getModifiers(); String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the number of parameters in constructors System.out.println("Parameters: " + c.getParameterCount()); System.out.println(""); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )
Output
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
In the above example, we have created a class named Dog. The class includes two constructors.
We are using reflection to find the information about the constructors of the class. Notice the statement,
Constructor() constructors = obj.getDeclaredConstructor();
Ở đây, chúng ta đang truy cập tất cả các hàm tạo có trong Dog và gán chúng cho một hàm tạo mảng cùng Constructor
kiểu.
Sau đó, chúng tôi sử dụng đối tượng c để nhận các thông tin khác nhau về hàm tạo.
- c.getName () - trả về tên của hàm tạo
- c.getModifiers () - trả về các công cụ sửa đổi truy cập của hàm tạo ở dạng số nguyên
- c.getParameterCount () - trả về số lượng tham số có trong mỗi hàm tạo
Để tìm hiểu thêm về các phương thức của Constructor
lớp, hãy truy cập lớp Constructor