2013-07-04 11 views
16

Mam metodę:Jak uzyskać wartość ciągu z pola Java przez odbicie?

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 = ??? 
     } 
    } 
} 

Gdy skończy mam wyjścia jak:

Field name: java.lang.String 

Teraz jak mam wyodrębnić rzeczywistą wartość ciągu do strValue, przy użyciu odbicia?

+0

Nie powinno być? 'System.out.println (" Nazwa pola: "+ field.getName());' –

+0

Tak - cut n 'wklej błąd! –

+1

Chcesz uzyskać wartość z tego pola? Na którym obiekcie? –

Odpowiedz

24

Wygląda na to, że potrzebujesz odniesienia do instancji klasy. Użytkownik powinien zadzwonić pod numer get i przekazać odwołanie, przesyłając zwrot do łańcucha.

Można użyć uzyskać w następujący sposób:

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

To niefortunny aspekt interfejsu API, który musisz przekazać w referencji, nawet jeśli pole jest statyczne. – Owen

+9

Możesz przekazać 'null'. –

+0

Awesome, good point. Zbyt dużo czasu spędziłem z dala od Javy. – Owen

5

w idealnych sytuacjach Class nie posiada danych. Zawiera jedynie informacje o strukturze i zachowaniu jego wystąpień, a wystąpienia Classes przechowują dane do użycia. Tak więc twoja metoda extractStringFromField nie może wyodrębnić wartości, chyba że przekażesz jakiekolwiek instancje (skąd faktycznie wyodrębni wartości).

Jeśli nazwa parametru odniesienia, trzeba przejechać, aby wyodrębnić wartość jest instance, można łatwo dostać co chcesz jak poniżej:

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

Wystarczy Przydatne kodu przykład dla pola refleksji:

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 
} 
Powiązane problemy