Java Reflection là gì? Hướng dẫn Java Reflection API

Bài viết đã được tác giả Trần Hữu Cương cho phép

Java Reflection là gì?

Java Reflection là một tính năng trong Java (còn được gọi là API hoặc thư viện). Java Reflection cho phép chúng ta truy cập và chỉnh sửa thông tin của một đối tượng (tên class, các field, các method) trong quá trình chạy chương trình.

Chúng ta có thể sử dụng Java Reflection trong những trường hợp chúng ta không biết chính xác loại đối tượng đang được xử lý. Chẳng hạn, chúng ta có thể không biết tên class, package, các field, method của đối tượng đó.

Có Thể Bạn Quan Tâm :   Cổ phiếu ESOP là gì? Có nên mua cổ phiếu ESOP hay không?

Ví dụ, nếu chúng ta muốn viết một hàm để sao chép hai đối tượng có thể được sử dụng cho các loại đối tượng khác nhau, chúng ta cần biết liệu hai đối tượng có cùng loại không, có những field nào, và sao chép giá trị từng field.

Ngoài ra, trong một số trường hợp, chúng ta không thể truy cập các field và method có đặc tả là private trong một class. Trong những trường hợp cần thiết, Reflection là một giải pháp.

Cung cấp cho bạn công việc Java cao thu nhập cho sinh viên mới tốt nghiệp

Một số framework sử dụng Java Reflection:

  • Spring
  • JUnit
  • Tomcat
  • Eclipse (được sử dụng để tự động hoàn thành)

Hạn chế và nhược điểm của Java Reflection

Trong trường hợp chúng ta đã biết rõ cấu trúc class và có quyền truy cập các field, method, chúng ta không nên sử dụng Java Reflection vì các lý do sau:

  • Hiệu năng thấp: Ví dụ, nó phải quét qua classpath để tìm class.
  • Vấn đề bảo mật: Việc chỉnh sửa class/ object trong quá trình runtime có thể ảnh hưởng tới các thread… và dẫn tới lỗi trong ứng dụng.
  • Khó bảo trì: Reflection khá khó hiểu đối với người mới và không dễ để debug. Điều này làm cho việc tìm lỗi trở nên rất khó. Ngoài ra, chúng ta không thể kiểm tra được một số lỗi trong quá trình biên dịch (không tìm thấy class, không tìm thấy field…)
Có Thể Bạn Quan Tâm :   Bài viết chuẩn SEO là gì? Hướng dẫn cách viết bài chuẩn SEO (2023)

Các thành phần trong Java Reflection

Tương ứng với các thành phần trong một class, Java Reflection cung cấp các class tương ứng để chúng ta có thể xử lý:

  • Class: Đại diện cho class/ interface để lấy ra các thông tin của class (tên class, super class, class modifier, các method, các field…)
  • Constructor: Xử lý các hàm khởi tạo của class
  • Field: Xử lý các field của class (tên, modifier của field, lấy giá trị, thiết lập giá trị cho object…)
  • Method: Xử lý các method của class (liệt kê các method, thực thi các method…)

Mã ví dụ về Java Reflection

Giả sử chúng ta có hai class sau:

Bây giờ, chúng ta sẽ liệt kê tất cả các field và method của Class Customer:

Chúng ta có thể lấy đối tượng Class thông qua một object bằng cách sử dụng phương thức getClass() hoặc thông qua tên package + tên class bằng phương thức Class.forName

Có Thể Bạn Quan Tâm :   Dao cạo râu tiếng anh là gì? đọc như thế nào cho đúng

Để lấy danh sách các hàm khởi tạo, các field, các method, chúng ta có thể sử dụng các phương thức getConstructors(), getFields() hoặc getMethods(). Tuy nhiên, các phương thức này không cho phép lấy các constructor, method, field có đặc tả là private. Do đó, chúng ta sử dụng các phương thức getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods().

Phương thức getModifier() trả về đặc tả của class, method, field dưới dạng số. Vì vậy, chúng ta có thể viết thêm phương thức getModifierName để hiển thị nó dưới dạng chuỗi.

Để lấy giá trị hoặc gán giá trị cho các field của đối tượng, chúng ta có thể sử dụng phương thức field.set() / field.get()

Ví dụ:

Một số bài viết bạn có thể quan tâm:

  • Java – ngôn ngữ không mới nhưng vẫn còn “hot”
  • Java đang đối mặt với nguy cơ tuyệt chủng?
  • Tìm hiểu về Serialization trong Java

Bài viết gốc được đăng tải tại stackjava.com

Xem thêm các công việc hấp dẫn về Java tại TopDev

You May Also Like

About the Author: admin