2009-06-24 4 views
12

Ich habe Methode, die ein POJO als Parameter bekommt. Jetzt möchte ich programmatisch alle Attribute des POJO erhalten (weil mein Code möglicherweise nicht alle Attribute zur Laufzeit kennt) und auch die Werte für die Attribute abfragen muss. Schließlich werde ich eine String-Darstellung des POJO bilden.Wie bekomme ich die Liste aller Attribute eines Java-Objekts mit BeanUtils Introspection?

Ich könnte ToStringBuilder verwenden, aber ich möchte meine Ausgabe Zeichenfolge in bestimmten Format für meine Anforderung spezifisch erstellen.

Ist es möglich in Beanutils!? Wenn ja, irgendwelche Zeiger auf den Methodennamen? Wenn nein, sollte ich meinen eigenen Reflexionscode schreiben?

+0

Sie verwenden ToStringStyle wird DEFAULT_STYLE predifined Arten haben. MULTI_LINE_STYLE: Der mehrzeilige toString-Stil. NO_FIELD_NAMES_STYLE: Die no-Feldnamen toString Stil. SHORT_PREFIX_STYLE: Das kurze Präfix toString style. SIMPLE_STYLE: Der einfache toString-Stil. Sehen Sie, wenn einer von ihnen Ihren Zweck lösen kann –

Antwort

9

Haben Sie versucht ReflectionToStringBuilder? Es sieht so aus als ob das tun sollte was du beschreibst.

+0

ja. es gibt mir die String-Darstellung meines POJO. aber ich möchte das string-format in einem anderen stil haben. Anstatt beispielsweise [email protected] [name = foo, desc = bar] zu verwenden, muss die Zeichenfolge "[name = foo; desc = bar;]" lauten. – Veera

+0

Vielleicht diese Version: http: // commons.apache.org/lang/api-release/org/apache/commons/lang/builder/ReflectionToStringBuilder.html#toString(java.lang.Object,%20org.apache.commons.lang.builder.ToStringStyle) –

+0

Hmm, Der obige Link wurde nicht korrekt kopiert. Es gibt eine Version, die das Objekt und einen ToStringStyle übernimmt, mit dem Sie die Ausgabe anpassen können. –

3

erhalten Sie alle Eigenschaften/Variablen (nur der Name) mit Reflektion. Verwenden Sie jetzt getProperty Methode, um den Wert dieser Variablen zu erhalten

+0

ja. Ich denke, ich muss diesen Ansatz nehmen. – Veera

15

Ich weiß, das ist ein Jahr alt Frage, aber ich denke, es kann für andere nützlich sein.

Ich habe eine Teillösung unter Verwendung dieses LOC

Field [] attributes = MyBeanClass.class.getDeclaredFields(); 

Hier ist ein funktionierendes Beispiel gefunden: Die Standard-toString Stil:

import java.lang.reflect.Field; 

import org.apache.commons.beanutils.PropertyUtils; 

public class ObjectWithSomeProperties { 

    private String firstProperty; 

    private String secondProperty; 


    public String getFirstProperty() { 
     return firstProperty; 
    } 

    public void setFirstProperty(String firstProperty) { 
     this.firstProperty = firstProperty; 
    } 

    public String getSecondProperty() { 
     return secondProperty; 
    } 

    public void setSecondProperty(String secondProperty) { 
     this.secondProperty = secondProperty; 
    } 

    public static void main(String[] args) { 

     ObjectWithSomeProperties object = new ObjectWithSomeProperties(); 

     // Load all fields in the class (private included) 
     Field [] attributes = object.getClass().getDeclaredFields(); 

     for (Field field : attributes) { 
      // Dynamically read Attribute Name 
      System.out.println("ATTRIBUTE NAME: " + field.getName()); 

      try { 
       // Dynamically set Attribute Value 
       PropertyUtils.setSimpleProperty(object, field.getName(), "A VALUE"); 
       System.out.println("ATTRIBUTE VALUE: " + PropertyUtils.getSimpleProperty(object, field.getName())); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
}