2010-01-24 34 views
63

Tôi có một lớp và tôi muốn tìm tất cả các biến công khai của nó (không phải các hàm). làm thế nào tôi có thể làm như vậy? cảm ơn!java: lấy tất cả các tên biến trong một lớp

+0

Bạn có thể thực hiện việc này bằng cách sử dụng [Reflection API] (http://java.sun.com/docs/books/tutorial/reflect/). – Crozin

Trả lời

94
Field[] fields = YourClassName.class.getFields(); 

trả về một mảng của 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 thừa kế. Nếu bạn muốn có các lĩnh vực chỉ được định nghĩa trong lớp trong câu hỏi, và không superclasses của nó, sử dụng getDeclaredFields(), và lọc public người thân với Modifier phương pháp sau đây:

Modifier.isPublic(field.getModifiers()); 

Các YourClassName.class đen 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 chiếu thú vị.

Lớp học Field ở trên là java.lang.reflect.Field. Bạn có thể xem toàn bộ gói java.lang.reflect.

+2

chỉ là một lưu ý - ban đầu câu trả lời của tôi có chứa một tuyên bố sai, nhưng nó đã được upvoted một số lần. Vui lòng đọc kỹ hơn;) – Bozho

+1

@downvoter - sai lầm là trước đây. Nếu bạn thấy ngay bây giờ, hãy chia sẻ. – Bozho

+0

là 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? –

1

Như đã đề cập một số người dùng, bên dưới mã có thể giúp tìm ra 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à dưới đây:

Với sự 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 của lớp kiểu String/integer/đôi, và các giá trị tương ứng trong một lớp bản đồ. (mà không sử dụng phản xạ api!)

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

Bạn có thể sử dụng bất kỳ của hai dựa trên nhu cầu của bạn:

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. 

Để lọc chỉ các lĩnh vực công cộng từ danh sách trên (dựa trên yêu cầu) sử dụng mã bên dưới:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList()); 
Các vấn đề liên quan