Java Reflection là gì?

Reflection thể hiện 1 sự phản chiếu khác của class. Java Reflection là một bộ API quan trọng của Java giúp người dùng lấy được thông tin class/super class, duyệt field, method, thay đổi dữ liệu của field hoặc thực thi lời gọi method mà chỉ cần biết tên và tham số dưới dạng String

Ứng dụng của Java Reflection

Java Reflection được ứng dụng trong rất nhiều hệ thống lớn nhỏ, các component mang tính tổng quát cần sử dụng chung cho nhiều class khác nhau. Ví dụ điển hình và thường gặp nhất của Java Reflection là việc gọi hàm từ xa với Webservice Soap, toàn bộ class xử lý nghiệp vụ được xây dựng trên server, soap client chỉ cần 1 bản xml mô tả class dưới dạng text kèm theo url soap server là có thể thực thi được các nghiệp vụ đó từ xa. Mình sẽ ví dụ cụ thể hơn bằng các đoạn sample code dưới.

Object test

Lấy thông tin class

Lấy thông tin field

Lấy thông tin method

Main test

Kết quả khi chạy chương trình

Ở các sample trên có thể thấy, chỉ cần có tên của class dưới dạng String  "net.tunghuynh.reflect.Person"  là có thể lấy được thông tin của class cũng như danh sách field và method đã khai báo trong class.

Tạo Object mới và khởi tạo giá trị cho field

Kết quả

Ta có thể kiểm chứng lại instance của object mới tạo bằng cách debug xem có đúng là Person hay không

Sample trên cho thấy, ta có thể tạo 1 object mới từ tên class và gán giá trị cho các thuộc tính trong object chỉ với tên field. Nhưng có 1 vấn đề ở đây, với các field có modifier không phải là public thì không thể gán giá trị trực tiếp được mà cần phải cấp quyền truy cập vào các field này bằng lệnh  field.setAccessible(true);

Gọi một method trong class bằng Java Reflection

Kết quả

Để invoke được 1 method thì ta không cần tên của parameter nhưng buộc phải biết số lượng và thứ tự datatype của các parameter, bởi vì trong java hỗ trợ overloading, các method có thể giống tên nhau nhưng khác số lượng và thứ tự parameter.

Với các sample trên, ta cũng hoàn toàn có thể thay sử dụng   Class clazz = Person.class;  để thay cho   Class clazz = Class.forName("net.tunghuynh.reflect.Person");  mà không ảnh hưởng gì đến logic.

Để tiện cho việc sử dụng, mình thường tạo 1 class Util để get và set giá trị cho 1 field bất kỳ trong object khi cần thiết.

Với class này, có thể truyền trực tiếp object để xử lý và gán giá trị cho field bằng tên không cần gọi getter setter

Sử dụng

Ở bài sau, mình sẽ đề cập đến vấn đề nâng cao hơn của Java Reflection, đó là Reflect với Annotation

 

Bình luận