2009-06-24 5 views
12

Ho un metodo che ottiene un POJO come parametro. Ora voglio ottenere a livello di codice tutti gli attributi del POJO (perché il mio codice potrebbe non sapere quali sono tutti gli attributi in esso in fase di esecuzione) e ha bisogno di ottenere anche i valori per gli attributi. Finalmente formerò una rappresentazione in stringa del POJO.Come ottenere l'elenco di tutti gli attributi di un oggetto Java utilizzando l'introspezione BeanUtils?

Potrei usare ToStringBuilder, ma voglio costruire la mia stringa di output in un determinato formato specifico per il mio requisito.

È possibile farlo in Beanutils!? Se sì, qualche puntatore al nome del metodo? Se no, dovrei scrivere il mio codice di riflessione?

+0

Si può usare ToStringStyle, che sta avendo Predifined DEFAULT_STYLE: lo stile toString di default. MULTI_LINE_STYLE: lo stile multi-line toString. NO_FIELD_NAMES_STYLE: i nomi dei campi non hanno lo stile toString. SHORT_PREFIX_STYLE: lo stile breve prefisso toString. SIMPLE_STYLE: lo stile semplice di toString. Verificare se uno di questi può risolvere il proprio scopo –

risposta

9

Hai provato ReflectionToStringBuilder? Sembra che dovrebbe fare ciò che descrivi.

+0

sì. mi dà la rappresentazione stringa del mio POJO. ma, voglio che il formato della stringa sia in uno stile diverso. Ad esempio, invece di avere [email protected] [name = foo, desc = bar], voglio che la stringa sia "[nome = pippo; desc = bar;]" – Veera

+0

Forse questa versione: 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, il link sopra non è stato copiato correttamente. Esiste una versione che accetta l'oggetto e un ToStringStyle che dovrebbe consentire di personalizzare l'output. –

3

ottiene tutte le proprietà/variabili (solo il nome) utilizzando la riflessione. Ora usa il metodo getProperty per ottenere il valore di quella variabile

+0

sì. penso che dovrò prendere questo approccio. – Veera

15

So che questa è una domanda vecchia di un anno, ma penso che possa essere utile per gli altri.

Ho trovato una soluzione parziale di utilizzare questo LOC

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

Ecco un esempio di lavoro:

stili
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(); 
      } 

     } 
    } 
}