Java Reflection khá mạnh mẽ và có thể rất hữu ích. Java Reflection cho phép kiểm tra các lớp, giao diện, trường và phương thức trong thời gian chạy mà không cần biết tên của các lớp, phương thức, v.v. tại thời điểm biên dịch. Cũng có thể khởi tạo các đối tượng mới, gọi các phương thức và nhận / thiết lập các giá trị trường bằng cách sử dụng sự phản chiếu.
Một ví dụ về Reflection Java nhanh để cho bạn thấy việc sử dụng sự phản chiếu trông như thế nào:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
Ví dụ này thu được đối tượng Class từ lớp có tên MyObject. Sử dụng đối tượng lớp, ví dụ này nhận được một danh sách các phương thức trong lớp đó, lặp lại các phương thức và in ra tên của chúng.
Chính xác làm thế nào tất cả điều này hoạt động được giải thích ở đây
Chỉnh sửa : Sau gần 1 năm tôi đang chỉnh sửa câu trả lời này vì trong khi đọc về sự phản chiếu, tôi đã sử dụng thêm Reflection.
- Spring sử dụng cấu hình bean như:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
Khi bối cảnh Spring xử lý phần tử <bean> này, nó sẽ sử dụng Class.forName (String) với đối số "com.example.Foo" để khởi tạo Class đó.
Sau đó, nó sẽ lại sử dụng sự phản chiếu để có được bộ setter thích hợp cho phần tử <property> và đặt giá trị của nó thành giá trị được chỉ định.
- Junit sử dụng Reflection đặc biệt để thử nghiệm các phương pháp Riêng tư / Được bảo vệ.
Đối với phương thức riêng tư,
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
Đối với các lĩnh vực tư nhân,
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);