All Articles

Java Reflection là gì ?

  1. Reflection là một kĩ thuật cho phép có thể duyệt và thay đổi các thuộc tính và phuơng thức của một class hoặc một interface tại thời điểm runtime.

Những gì một Object có thể làm được như là get, set, gọi methods thì reflection cũng có thể làm giống vậy và nhiều hơn thế nữa. Nếu vậy thì dùng object instant là được rồi, sao phải dùng reflection. Khi nào thì dùng reflection ?

  1. Trước tiên ta tìm hiểu Reflection có thể làm gì ngoài get, set, gọi methods, new instance, get class name, …mà instance object không thể làm:

    • Thay đổi modifier của methods, constructor, fields (properties)
  2. Khi nào thì ứng dụng reflection:

    • Khi ta dùng closed code, mà ta cần chít chọt để set giá trị cho biến private, gọi private methods. Vì reflection có thể thay đổi private thành public.
    • Khi ta cần copy giá trị của những fields có cùng tên giữ 2 class, object khác nhau, thông thường là Model <—> Entity và chủ động loại trừ những fields không muốn copy. Sẽ dùng thư viện commons-beanutils của Apache nhưng bên dưới thư viện là họ dùng reflection để lấy ra tên fields của object và field type để so sánh và copy.
    • Trong JUnit Test, ta có Annotation như là: @BeforeClass, @Before, @Test, … để những annotation này được thực thi trong thời gian thực là dùng Reflection. Vậy ta có thể tự viết 1 annotation cho riêng mình được không, yeah có thể.
    • Dependency Injection trong Sprint framework, Google Guice, ta khai báo 1 object cần instance (khởi tạo) và những giá trị cho constructor.
    • JSON Serialization / Deserialization (Jackson, Gson), json <—> object, dựa vào giá trị của biến là kiểu String, int hay array để parse cho đúng.
  3. Reflection mạnh vậy có nhược điểm không ? Chít chọt không đúng cách sẽ thành nhược điểm.

    • Code khó maintain vì chít chọt, và phá vỡ cấu trúc OOP