2012-07-02 22 views
6

C'è un modo in cui è possibile convertire automaticamente un oggetto di classe personalizzato in una stringa leggibile?Converti oggetto classe in stringa leggibile dall'uomo

ad es. prendere in considerazione la seguente classe:

class Person { 
    String Name; 
    int Salary; 
    ... 
} 

Person p = new Person(); 
p.setName("Tony"); 
p.setSalary(1000); 

ho bisogno di ottenere qualcosa di simile:

Person: Name="Tony", Salary=1000 
+0

scrivere un'utilità di riflessione per stampare tutti i suoi campi? –

+0

sì, questo è quello che sto cercando.Ma dal momento che usare il riflesso renderà tutto abbastanza generale, mi chiedevo se ce n'è uno già disponibile da qualche parte! – MBZ

risposta

7

Importazione Commons Lang si potrebbe usare ToStringBuilder

Controllare metodo reflectionToString(java.lang.Object), questo creerà automaticamente la rappresentazione vi aspettate.

Questo codice:

Person p = new Person(); 
p.setName("Tony"); 
p.setSalary(1000); 

System.out.println(ToStringBuilder.reflectionToString(p)); 

risultati di questa stringa:

[email protected][Name=Tony,Salary=1000] 
2

sicuro che è possibile eseguire l'override del metodo della classe toString.

come segue:

class Person { 
    String name; 
    int salary; 
    ... 
    @Override public String toString() { 
     return "Person: Name='" + name + "', Salary=" + salary; 
    } 
} 

riferimento per maggiori dettagli https://blogs.oracle.com/CoreJavaTechTips/entry/writing_tostring_methods_tech_days

+1

vuoi dire 'p.toString();' ??? o semplicemente semplicemente 'p' java invocherà automaticamente toString su di esso per stamparlo. –

+0

ya che stamperà l'oggetto come una stringa. –

+0

puoi anche chiamarlo direttamente oggetto semplicemente semplicemente p andrà bene anche se vuoi specificarlo esplicitamente quindi anche tu puoi .. –

2

Questo è fondamentalmente ciò che è per toString. Ma dato che vuoi farlo automaticamente, puoi creare un servizio generale che può farlo. Utilizzare la riflessione per ripetere tutti i campi e quindi stampare il nome e il valore di ciascuno. Il modo più semplice per stampare i propri valori è usando il loro toString, ma in alcuni casi è anche possibile passarli in quel servizio di stampa in modo ricorsivo (ovviamente dovrai trovare la condizione di arresto).

Ad esempio, in alcuni PrintUtils classe avere:

public static void printFields(Object o) { 
    System.out.print(o.getClass.getSimpleName() + ": "); 
    for (Field field : o.getClass().getDeclaredFields()) { 
     field.setAccessible(true);  // you also get non-public fields 
     System.out.print(field.getName() + " = " + field.get(o) + ", "); 
    } 
} 

Dovrete gestire le eccezioni, ecc ed eventualmente meglio formattare l'output, naturalmente. Inoltre, questo solo i campi di stampa dichiarati nella classe corrente. Se vuoi campi dichiarati più alti nella gerarchia dell'ereditarietà, dovrai lavorare un po 'di più. Infine, l'uso della reflection è molto più lento rispetto al normale toString. Se è possibile utilizzare toString, è preferibile.

+0

A seconda delle sue esigenze, potrebbe semplicemente fare affidamento sui getter pubblici. Ciò semplificherebbe la logica, richiedendogli solo di eseguire iterate su 'getMethods'. –

+0

@MarkoTopolnik, sì, certo. Dimostro solo la possibilità, l'effettiva implementazione dovrebbe corrispondere ai requisiti specifici. – eran

+0

Nessuna contesa, solo un'aggiunta :) –

0
class Person { 
    String Name; 
    int Salary; 
    ... 

    @Override 
    public String toString() { 
    return "Person: Name = " + Name + "," + 
      "Salary="+Salary; 
    } 
} 

Person p = new Person(); 
p.setName("Tony"); 
p.setSalary(1000); 
System.out.println(p.toString()); 
0

Un modo per farlo è quello di fare affidamento su Apache Commons BeanUtils.describe. Ciò produrrà un Map di proprietà del bean, che converte in una stringa piacevolmente tramite Map.toString. Se desideri qualcosa di più personalizzato, dovrai approfondire l'API di reflection.