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.
Bạn đang xem: Java Reflection là gì? Hướng dẫn Java Reflection API
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 đó.
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
Xem thêm : Da lộn là gì? Khái niệm, phân loại và cách bảo quản vải da lộn
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á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
Xem thêm : Giới thiệu Aspect Oriented Programming (AOP)
Để 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