2013-07-04 40 views
16

Tôi có một phương pháp:Cách lấy giá trị chuỗi từ một trường Java thông qua sự phản ánh?

public void extractStringFromField(Class<?> classToInspect) { 
    Field[] allFields = classToInspect.getDeclaredFields(); 

    for(Field field : allFields) { 
     if(field.getType().isAssignableFrom(String.class)) { 
      System.out.println("Field name: " + field.getName()); 

      // How to get the actual value of the string?!?! 
      // String strValue = ??? 
     } 
    } 
} 

Khi điều này chạy tôi nhận được kết quả như sau:

Field name: java.lang.String 

Bây giờ làm thế nào để trích xuất các giá trị chuỗi thực tế vào strValue, sử dụng phản ánh?

+0

Phải không? 'System.out.println (" Tên trường: "+ field.getName());' –

+0

Có - cắt lỗi 'dán'! –

+1

Bạn muốn nhận giá trị của trường nào? Trên đối tượng nào? –

Trả lời

24

Dường như bạn cần tham chiếu đến phiên bản của lớp học. Bạn sẽ muốn gọi get và chuyển vào tham chiếu, truyền trở lại một Chuỗi.

Bạn có thể sử dụng được như sau:

String strValue = (String) field.get (objectReference); 
+0

Đó là một khía cạnh không may của API mà bạn cần phải vượt qua trong một tham chiếu ngay cả khi trường là tĩnh. – Owen

+9

Bạn có thể chuyển 'null'. –

+0

Tuyệt vời, điểm tốt. Tôi đã mất quá nhiều thời gian từ Java. – Owen

5

Trong tình huống lý tưởng, Class không giữ dữ liệu. Nó chỉ giữ thông tin về cấu trúc và hành vi của các cá thể của nó và các cá thể của số Classes giữ dữ liệu của bạn để sử dụng. Vì vậy, phương pháp extractStringFromField của bạn không thể trích xuất các giá trị trừ khi bạn vượt qua bất kỳ trường hợp nào (từ nơi nó thực sự sẽ trích xuất các giá trị).

Nếu tên của tham số của tham chiếu, bạn đang đi qua để trích xuất giá trị là instance, sau đó bạn có thể dễ dàng có được những gì bạn muốn như dưới đây:

String strValue = (String)field.get(instance); 
1

Chỉ hữu ích mã ví dụ cho các lĩnh vực phản ánh:

Field[] fields = InsanceName.getDeclaredFields(); 
for (Field field : fields) {  //array for fields names 

System.out.println("Fields: " + Modifier.toString(field.getModifiers())); // modyfiers 
System.out.println("Fields: " + field.getType().getName()); //type var name 
System.out.println("Fields: " + field.getName());  //real var name 
field.setAccessible(true);        //var readable 
System.out.println("Fields: " + field.get(InsanceName)); //get var values 
System.out.println("Fields: " + field.toString());  //get "String" values 
System.out.println(""); //some space for readable code 
} 
Các vấn đề liên quan