2013-07-04 4 views
16

Ich habe eine Methode:Wie erhält man einen String-Wert aus einem Java-Feld über Reflektion?

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

Wenn dies Ich mag erhalten Ausgang läuft:

Field name: java.lang.String 

Nun, wie extrahiere ich den tatsächlichen String-Wert in strValue, Reflexion mit?

+0

Sollte es nicht sein? 'System.out.println (" Feldname: "+ Feld.getName());' –

+0

Ja - Schnitt n 'Einfügen Fehler! –

+1

Sie möchten den Wert des Feldes erhalten? Auf welches Objekt? –

Antwort

24

Offenbar benötigen Sie einen Verweis auf eine Instanz der Klasse. Sie würden get aufrufen und die Referenz übergeben, um die Rückgabe an einen String zu übergeben.

können Sie verwenden, erhalten Sie wie folgt vor:

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

Es ist ein unglücklicher Aspekt der API, dass Sie eine Referenz übergeben müssen, selbst wenn das Feld statisch ist. – Owen

+9

Sie können "null" übergeben. –

+0

Super, guter Punkt. Ich war zu lange von Java entfernt. – Owen

5

In idealen Situationen, Class keine Daten halten. Es enthält lediglich die Informationen über die Struktur und das Verhalten seiner Instanzen und Instanzen der Classes halten Ihre Daten zu verwenden. Ihre extractStringFromField-Methode kann also keine Werte extrahieren, wenn Sie keine Instanzen übergeben (von denen aus sie tatsächlich Werte extrahiert).

Wenn der Name des Parameters der Referenz, Sie übergeben Wert zu extrahieren ist instance, dann kann man leicht bekommen, was Sie wie unten wollen:

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

Nur nützlich Beispielcode für Reflexionsfelder:

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 
} 
Verwandte Themen