Java: lấy tất cả các tên biến trong một lớp


91

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!


Bạn có thể làm điều này bằng cách sử dụng API phản chiếu .
Crozin

Câu trả lời:


134
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 Modifiercách tiếp cận sau :

Modifier.isPublic(field.getModifiers());

Chữ YourClassName.classthự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 Fieldlớp trên là java.lang.reflect.Field. Bạn có thể xem toàn bộ java.lang.reflectgói.


2
chỉ là một ghi chú - ban đầu câu trả lời của tôi có một tuyên bố sai, nhưng nó đã được ủng hộ nhiều lần. Vui lòng đọc cẩn thận hơn;)
Bozho

1
@downvoter - lỗi là trước đây. Nếu bạn thấy một bây giờ, xin vui lòng chia sẻ.
Bozho

giải pháp này có chậm không? hoặc chúng ta có thể sử dụng nó một cách tự do?
Dany Y

được rồi. Nhưng đừng lạm dụng nó.
Bozho 27/12/12


15

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());

2

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());
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.