2013-02-27 4 views
14

Ich habe eine 2 POJO-Klassen mit Getter und Setter, jetzt versuche ich, alle Klasseninstanzvariablen dieser Klasse zu bekommen.Holen Sie die Klasseninstanzvariablen und drucken Sie ihre Werte mit Reflektion

Ich habe gelernt, dass wir Reflexion verwenden können, wie es geht?

Dies ist meine POJO-Klasse, die meine Reflexionsklasse erweitern wird.

class Details{ 

private int age; 
private String name; 

} 

Reflection Klasse ist wie folgt:

class Reflection{ 

public String toString(){ 

return all the fields of that class 
} 
+2

Haben Sie * irgendwelche * Reflektionsanleitungen angeschaut oder irgendwelche Dokumente angeschaut? –

+0

ja ich habe das http://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-variable – Goofy

+0

können Sie auf meine Pojo-Klasse – Goofy

Antwort

27

Sie so etwas tun könnte:

public void printFields(Object obj) throws Exception { 
    Class<?> objClass = obj.getClass(); 

    Field[] fields = objClass.getFields(); 
    for(Field field : fields) { 
     String name = field.getName(); 
     Object value = field.get(obj); 

     System.out.println(name + ": " + value.toString()); 
    } 
} 

Dies würde nur die öffentlichen Felder drucken, drucken private Felder Klasse. getDeclaredFields rekursiv.

Oder wenn Sie würde die Klasse erweitern:

public String toString() { 
    try { 
     StringBuffer sb = new StringBuffer(); 
     Class<?> objClass = this.getClass(); 

     Field[] fields = objClass.getFields(); 
     for(Field field : fields) { 
      String name = field.getName(); 
      Object value = field.get(this); 

      sb.append(name + ": " + value.toString() + "\n"); 
     } 

     return sb.toString(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

ok, aber kann ich toString-Methode überschreiben und mach es genauso? Was wird mir alle Felder zurückgeben? – Goofy

+0

Sicher, Sie müssten den Namen/Wert an eine Zeichenfolge anhängen, anstatt sie auszudrucken, und Sie würden auch einen Verweis auf eine Instanz der Klasse Details in Ihrer Reflection-Klasse benötigen. – Emiel

+0

Ich werde Ihnen sagen, was ich zu tun versuche, wenn ich die Klasse erweitern, die toString-Methode hat und alle Feldnamen drucken ... aber das Problem ist toString ist eine Buit in Methode und kann keine Parameter an diese übergeben – Goofy

1

Die Auflösung Code oder Antwort, die oben erwähnt sind, haben ein Problem. Um den Wert eines privaten varible Zugriff auf ihre Zugriffstyp auf true

Field[] fields = objClass.getDeclaredFields(); 
for (Field field : fields) { 
    NotNull notNull = field.getAnnotation(NotNull.class); 
    field.setAccessible(true); 
} 

sonst wird es java.lang.IllegalAccessException werfen gesetzt werden müssen. Class Reflection kann nicht auf ein Element der Klasse Details mit den Modifikatoren "private" zugreifen

1
ClassLoader classLoader = Main.class.getClassLoader(); 
    try { 
     Class cls = classLoader.loadClass("com.example.Example"); 
     Object clsObject = cls.newInstance(); 

     Field[] fields = cls.getFields(); 
     for (Field field : fields) { 
      String name = field.getName(); 
      Object value = field.get(clsObject); 

      System.out.println("Name : "+name+" Value : "+value); 

     } 
     System.out.println(cls.getName()); 


    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
0

Hinzufügen einer weiteren Zeile zum obigen Code. Wenn Sie auf die privaten Eigenschaften der Klasse zugreifen möchten, verwenden Sie die folgende Zeile

field.setAccessible (true);

Verwandte Themen