Bài viết được sự cho phép của tác giả Trần Hữu Cương
Mục lục
Java Reflection là gì?
Java Refelection là một tính năng (gọi là API hay thư viện cũng được) trong Java. Java Reflection cho phép truy cập các thông tin của đối tượng (tên class, các field, các method) và chỉnh sửa các field của đối tượng (kể cả các field private) trong quá trình run time.
Ta có thể áp dụng Java Reflection trong những trường hợp không biết object được xử lý là gì. (tên class là gì, ở package nào, có những field nào, method nào…).
Ví dụ mình muốn viết một hàm copy 2 đối tượng có thể dùng cho loại đối tượng khác nhau. Thì mình cần phải biết 2 đối tượng có cùng kiểu không, có những field nào, lấy và copy giá trị từng field.
Ngoài ra, với các field, method có modifier là private thì ta không thể truy cập ở bên ngoài class đó. Trong những trường hợp bắt buộc phải gọi, truy cập các field, method private ở bên ngoài class đó thì Reflection là một giải pháp.
Tuyển dụng Java lương cao cho SV mới ra trường
Một số framework sử dụng Java Reflection:
- Spring
- JUnit
- Tomcat
- Eclipse (dùng để autocomplete)
- …
Hạn chế, nhược điểm của Java Reflection
Trong trường hợp đã biết rõ cấu trúc class, có quyền truy cập các field, method thì ta không nên sử dụng Java Reflection bởi các lý do sau:
- Hiệu năng thấp: Ví dụ nó phải quét classpath để tìm class.
- Các 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 … khiến cho ứng dụng bị fail.
- Khó bảo trì: Việc Reflection khá khó hiểu với người mới và không dễ để debug, nên sẽ rất khó để có thể tìm ra lỗi. Ngoài ra chúng ta cũng không thể check được một số lỗi trong quá trình compile (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, thì Java Reflection cũng cung cấp các class tương ứ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 …)
Code ví dụ Java Reflection
Giả sử mình có 2 class sau:
Bây giờ mình sẽ thực hiện liệt kê tất cả các field, method của Class Customer:
Bạn có thể lấy đối tượng Class thông qua một object với method getClass() hoặc thông qua tên package + tên class với method sentayho.com.vname
Để lấy danh cách các hàm khởi tạo, các field, các method ta có thể dùng method getConstructors(), getFields() hoặc getMethods(). Tuy nhiên các method không cho phép lấy các constructor, method, field có modifier là private do đó mình sẽ dùng getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods().
Method getModifier() trả về modifier của class, method, field nhưng ở dạng số dó đó mình sẽ viết thêm method getModifierName để hiển thị nó dưới dạng String.
Để lấy giá trị hoặc truyền giá trị cho các field của đối tượng bạn có thể dùng method sentayho.com.vn() / sentayho.com.vn()
Demo:
Có thể bạn quan tâm:
- Java – ngôn ngữ không mới nhưng chưa bao giờ ngừng “hot”
- Java đang giãy chết?
- Nói về Serialization trong Java
Bài viết gốc được đăng tải tại sentayho.com.vn
Xem thêm các việc làm Java hấp dẫn tại TopDev