Cách tiếp cận tốt nhất ở đây là sử dụng Mẫu khách truy cập để tìm tất cả các trường trong lớp và tất cả các siêu lớp và thực hiện hành động gọi lại trên chúng.
Thực hiện
Spring có một lớp Tiện ích tuyệt vời ReflectionUtils
làm được điều đó: nó định nghĩa một phương thức để lặp qua tất cả các trường của tất cả các siêu lớp với một lời gọi lại:ReflectionUtils.doWithFields()
Tài liệu:
Gọi lệnh gọi lại đã cho trên tất cả các trường trong lớp đích, đi lên cấu trúc phân cấp lớp để lấy tất cả các trường đã khai báo.
Các tham số:
- clazz - lớp đích cần phân tích
- fc - lệnh gọi lại để gọi cho mỗi trường
- ff - bộ lọc xác định các trường để áp dụng lệnh gọi lại
Mã mẫu:
ReflectionUtils.doWithFields(RoleUnresolvedList.class,
new FieldCallback(){
@Override
public void doWith(final Field field) throws IllegalArgumentException,
IllegalAccessException{
System.out.println("Found field " + field + " in type "
+ field.getDeclaringClass());
}
},
new FieldFilter(){
@Override
public boolean matches(final Field field){
final int modifiers = field.getModifiers();
// no static fields please
return !Modifier.isStatic(modifiers);
}
});
Đầu ra:
Tìm thấy lĩnh vực thoáng qua tin boolean javax.management.relation.RoleUnresolvedList.typeSafe trong kiểu lớp javax.management.relation.RoleUnresolvedList
tìm thấy lĩnh vực thoáng qua tin boolean javax.management.relation.RoleUnresolvedList.tainted trong kiểu lớp javax.management.relation.RoleUnresolvedList
lĩnh vực tìm thấy private transient java.lang.Object [] java.util.ArrayList.elementData trong type class java.util.ArrayList
Found trường private int java.util.ArrayList.size trong type class java.util.ArrayList Trường
Found được bảo vệ thoáng qua int java. use.AbstractList.modCount trong loại lớp java.util.AbstractList