Ánh xạ trong java

Trong hướng dẫn này, chúng ta sẽ học 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 Classlà 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

Name: 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() – returns the name of the class
  • obj.getModifiers() – returns the access modifier of the class
  • obj.getSuperclass() – returns the super class of the class

Để 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 Modifierlớ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.reflectnày cung cấp các lớp có thể được sử dụng để thao tác với các thành viên trong lớp. Ví dụ,

  • Method class – provides information about methods in a class
  • Field class – provides information about fields in a class
  • Constructor class – provides information about constructors in a class

1. Phản ánh các phương thức Java

Các Methodlớ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

Method Name: display
Modifier: public
Return Types: void
 
Method Name: makeSound
Modifier: private
Return Types: 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 đó, chúng tôi đã lần đầu tiên tạo ra một đối tượng obj của Classviệc sử dụng getClass()phương pháp.

Lưu ý 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 Methodlớp. Đây,

  • m.getName() – returns the name of a method
  • m.getModifiers() – returns the access modifier of methods in integer form
  • m.getReturnType() – returns the return type of methods

Các Methodlớ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 Fieldlớ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

Value: 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");

Ở đây, chúng ta đang truy cập trường công khai của lớp Dog và gán nó cho trường đối tượng1 của lớp Field .

Sau đó, chúng tôi sử dụng các phương thức khác nhau của Fieldlớp:

  • 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

Tương tự, chúng ta cũng có thể truy cập và sửa đổi các trường riêng tư. Tuy nhiên, phản ánh của lĩnh vực tư nhân hơi khác so với lĩnh vực công. Ví dụ,

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();
    }
  }
}

Đầu ra

Value: brown
Modifier: private

Trong ví dụ trên, chúng ta đã tạo một lớp có tên là Dog . Lớp chứa một trường riêng có tên là màu . Chú ý câu lệnh.

Field field1 = obj.getDeclaredField("color");

field1.setAccessible(true);

Ở đây, chúng tôi đang truy cập màu và gán nó cho trường đối tượng1 của Fieldlớp. Sau đó, chúng tôi sử dụng field1 để sửa đổi khả năng tiếp cận của màu và cho phép chúng tôi thực hiện các thay đổi đối với nó.

Sau đó, chúng tôi sử dụng field1 để thực hiện các thao tác khác nhau trên màu trường riêng.

Để tìm hiểu thêm về các phương pháp khác nhau của Trường , hãy truy cập Lớp Trường Java (tài liệu Java chính thức) .

3. Phản ánh của Java Constructor

Chúng ta cũng có thể kiểm tra các hàm tạo khác nhau của một lớp bằng cách sử dụng các phương thức khác nhau do Constructorlớp cung cấp . Ví dụ,

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();
    }
  }
}

Đầu ra

Constructor Name: Dog
Modifier: public     
Parameters: 0        

Constructor Name: Dog
Modifier: private    
Parameters: 1

Trong ví dụ trên, chúng ta đã tạo một lớp có tên là Dog . Lớp bao gồm hai hàm tạo.

Chúng tôi đang sử dụng sự phản chiếu để tìm thông tin về các hàm tạo của lớp. Lưu ý tuyên bố,

Constructor[] constructors = obj.getDeclaredConstructor();

Ở đây, chúng tôi đang truy cập vào tất cả các nhà thầu có mặt trong Chó và gán chúng vào một mảng nhà xây dựng của các Constructorloại.

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() – returns the name of the constructor
  • c.getModifiers() – returns the access modifiers of the constructor in integer form
  • c.getParameterCount() – returns the number of parameters present in each constructor

Để tìm hiểu thêm về các phương thức của Constructorlớp, hãy truy cập vào lớp Constructor









Gõ tìm kiếm nhanh...