REFLECTION TRONG JAVA – TÌM HIỂU NHANH VỀ JAVA REFLECTION

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.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.

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

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ứcMô 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á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ề.

Ư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.
Related Posts
Lịch sử ngôn ngữ lập trình Java

Java (phiên âm Tiếng Việt: "Gia-va") là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết Read more

Phím tắt trong Eclipse giúp tăng năng suất coding

Các phím tắt sẽ giúp tốc độ coding của bạn nhanh hơn rất nhiều, hơn nữa format code của bạn Read more

Lập trình Hướng đối tượng(OOP)

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mẫu hình lập trình dựa trên Read more

Kiểu dữ liệu Nguyên thủy(Primitive)

1. Tổng quan Trong ngôn ngữ lập trình Java có 2 kiểu dữ liệu chúng ta cần nắm và phân Read more

Hãy bình luận đầu tiên

Để lại một phản hồi