× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Reflection trong Java - Tìm hiểu nhanh về Java Reflection trong 5 phút

28/07/2021 01:38

Trong bài viết này, chúng ta sẽ tiếp tục thảo luận về Reflection trong Java. Ở đây, chúng ta sẽ tìm hiểu về khái niệm Reflection Java, cách sử dụng nó để lấy dữ liệu và ưu, nhược điểm của Reflection trong Java. 

Khái niệm về Reflection trong Java

Reflection trong Java là một API - Application Programming Interface (Giao diện lập trình ứng dụng), được sử dụng trong thời gian chạy để phân tích hoặc thay đổi lớp, phương thức và giao diện. Nó là quá trình kiểm tra hoặc sửa đổi các hành vi trong thời gian chạy của một lớp tại thời gian chạy.

Java Reflection

Java.lang.Class là một lớp cung cấp nhiều phương thức mà chúng ta có thể sử dụng để lấy siêu dữ liệu của lớp cũng như kiểm tra và thay đổi hành vi thời gian chạy của một lớp. Có hai gói là java.lang và java.lang.reflect cung cấp các lớp cho Java Reflection.

Một số điểm về Reflection trong Java là:

  • Các lớp cần thiết để phản chiếu trong Java có trong gói java.lang.reflect.
  • Reflection cung cấp cho chúng ta các dữ liệu về lớp với các đối tượng  liên kết và phương thức cho lớp đó.
  • Thông qua sự phản chiếu, chúng ta có thể gọi một phương thức tại thời gian chạy độc lập với trình xác định truy cập của chúng.

>>> Đọc thêm: Cấu trúc dữ liệu phân cấp trong Java - Giải mã cấu trúc dữ liệu quan trọng

Reflection trong Java được sử dụng ở đâu?

Java Reflection

Ví dụ về Reflection trong Java

Reflection API của Java chủ yếu được sử dụng trong:

  • IDE như Eclipse, MyEclipse, NetBean,....
  • Trình gỡ lỗi
  • Công cụ kiểm tra

Lớp java.lang.Class

Lớp  java.lang.Class thực hiện hai nhiệm vụ như sau:

  • Nó cung cấp các phương thức để lấy các siêu dữ liệu của một lớp tại thời gian chạy
  • Nó cung cấp các phương thức để kiểm tra và thay đổi hành vi của lớp tại thời gian chạy

Các phương thức thường được sử dụng của lớp Class:

 

Phương thức

Mô tả

public String getName()

Trả lại tên của lớp

public static Class forName(String className)

Phương thức này tải lớp và trả lại tham chiếu của lớp

public Object newInstance()

Nó tạo nên một đối tượng mới của lớp

public boolean isInterface()

Phương thức này kiểm tra xem liệu nó có phải là một giao diện hay không

public boolean isArray()

Phương thức này kiểm tra xem liệu nó có phải một mảng hay không

public boolean isPrimitive()

Phương thức này kiểm tra xem liệu nó có phải nguyên thủy hay không

public Class getSuperclass()

Nó trả về siêu lớp hoặc tham chiếu lớp cha

public Field[] getDeclaredFields()

Nó trả về tổng số fields trong lớp

public Method[] getDeclaredMethods()

Nó trả lại tổng số phương thức của lớp

public Method getDeclaredMethod(String name,Class[] parameterTypes)

Phương thức này trả lại phương thức lớp instance

public Constructor[] getDeclaredConstructors()

Nó trả lại tổng số hàm tạo của  lớp

 

>>>> Đọc thêm: Array và Arraylist - Sự khác biệt giữa Array và Arraylist trong Java

Cách lấy đối tượng của lớp Class của Reflection trong Java

Có ba cách lấy đối tượng của lớp Class như sau:

Phương thức của lớp Class forName()

Phương thức forName() tải lớp động hoặc trong thời gian chạy. Phương thức này trả về biến của lớp Class. Chúng ta chỉ nên sử dụng phương thức này nếu chúng ta biết tên đạt tiêu chuẩn của lớp đó. Chúng ta không thể sử dụng tên này cho các loại nguyên thủy.

Ví dụ:

class Demo {}

class Test {

  public static void main(String args[]) {

    try {

      Class c = Class.forName("Demo");

      System.out.println(c.getName());

    }

    catch(Exception e) {

      System.out.println(e);

    }

  }

}

Output

Demo

 

Phương thức của lớp Object getClass()

Phương thức getClass() thuộc về lớp Object và trả về biến trong lớp Class. Chúng ta nên sử dụng nó khi chúng ta biết kiểu của nó. Chúng ta cũng có thể sử dụng nó với các biến nguyên thủy.

class Demo {}

class Test {

  void printName(Object obj) {

    Class c = obj.getClass();

    System.out.println(c.getName());

  }

  public static void main(String args[]) {

    Demo obj = new Demo();

    Test t = new Test();

    t.printName(obj);

  }

}

Output

Demo

Cú pháp .class

Đôi khi, có tình huống khi một kiểu có sẵn nhưng không có thể hiện của lớp. Trong những trường hợp như thế, chúng ta có thể lấy lớp bằng cách thêm cú pháp .class vào tên của kiểu. Chúng ta cũng có thể sử dụng các cú pháp này với các nguyên mẫu.

Ví dụ:

class Demo {

  public static void main(String args[]) {

    Class c1 = boolean.class;

    System.out.println(c1.getName());




    Class c2 = Demo.class;

    System.out.println(c2.getName());

  }

}

 

Output

boolean

Demo

Lấy thông tin bằng cách sử dụng Reflection API trong Java

Chúng ta có thể sử dụng Reflection để lấy các thông tin về:

  • Class: Phương thức getClass() cho biết tên của lớp mà đối tượng thuộc về
  • Constructors: Phương thức getConstructors() trả về tất cả các hàm tạo công hai của lớp mà đối tượng thuộc về
  • Methods: Phương thức getMethods () đưa ra tất cả các phương thức chung của lớp mà một đối tượng thuộc về.

Tham khảo: Khóa học lập trình Java

Ưu điểm của việc sử dụng Reflection trong Java

Tính năng mở rộng: Tính năng reflection cho phép ứng dụng để sử dụng các lớp bên ngoài và do người dùng định nghĩa bằng cách tạo các thể hiện của các đối tượng có thể mở rộng bằng cách sử dụng tên đầy đủ của chúng.

Công cụ gỡ lỗi và kiểm tra: Trình gỡ lỗi sử dụng thuộc tính reflection để phát hiện các thành viên riêng của một lớp.

Nhược điểm của việc sử dụng Reflection trong Java

  1. Performance Overhead: Việc thực hiện các hoạt động của Reflection chậm hơn các hoạt động non -reflection. Chúng ta không nên sử dụng phản xạ trong các phần mã mà chúng ta thường gọi trong các ứng dụng nhạy cảm với hiệu suất.
  2. Exposure of Internals: Mã Reflection vi phạm khái niệm trừu tượng và do đó có thể có sự thay đổi trong hành vi với các bản nâng cấp của nền tảng.

Kết luận: Trong bài viết này, T3H đã cung cấp cái nhìn tổng quan về Reflection trong Java và thảo luận về một số ưu nhược điểm của Reflection. Hy vọng bạn đã hiểu hơn về reflection và có thể sử dụng nó trong các dự án tiếp theo. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình tại Viện công nghệ thông tin T3H.