Tôi có một lớp và tôi muốn tìm tất cả các trường công khai của nó (không phải phương thức). Tôi có thể làm cái này như thế nào?
Cảm ơn!
Câu trả lời:
Field[] fields = YourClassName.class.getFields();
trả về một mảng tất cả các biến công khai của lớp.
getFields()
trả lại các trường trong toàn bộ lớp học. Nếu bạn chỉ muốn xác định các trường trong lớp được đề cập chứ không phải các lớp cha của nó, hãy sử dụng getDeclaredFields()
và lọc các trường public
đó theo Modifier
cách tiếp cận sau :
Modifier.isPublic(field.getModifiers());
Chữ YourClassName.class
thực sự đại diện cho một đối tượng kiểu java.lang.Class
. Kiểm tra tài liệu của nó để biết thêm các phương pháp phản ánh thú vị.
Các Field
lớp trên là java.lang.reflect.Field
. Bạn có thể xem toàn bộ java.lang.reflect
gói.
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html cũng có các biểu đồ để định vị các phương thức và hàm tạo.
Bạn có thể sử dụng bất kỳ cái nào trong hai cái dựa trên nhu cầu của mình:
Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.
Để chỉ lọc các trường công khai từ danh sách trên (dựa trên yêu cầu), hãy sử dụng mã dưới đây:
List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
Collectors.toList());
Như đã được ít người dùng đề cập, mã dưới đây có thể giúp tìm tất cả các trường trong một lớp nhất định.
TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
String name=method.getName();
if(name.startsWith("get"))
{
System.out.println(name.substring(3));
}else if(name.startsWith("is"))
{
System.out.println(name.substring(2));
}
}
Tuy nhiên, một cách tiếp cận thú vị hơn là:
Với sự trợ giúp của thư viện Jackson, tôi có thể tìm thấy tất cả các thuộc tính lớp của kiểu String / integer / double và các giá trị tương ứng trong một lớp Bản đồ. ( mà không sử dụng api phản xạ! )
TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();
Map<String,Object> props = m.convertValue(testObject, Map.class);
for(Map.Entry<String, Object> entry : props.entrySet()){
if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}