2010-03-09 25 views
8

estoy cuurently utilizaré Commons API de Apache (Commmons-lang.jar) para imprimir un valor de los objetos como se muestra a continuación:ToStringBuilder no se imprime el contenido de los objetos anidados

ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE)) 

Pero este código no se imprime valor si el objeto tiene un método getter que devuelve otro objeto.

Por ejemplo tengo el objeto Person tiene un método getter que devuelve el objeto Address. Usando el código anterior, solo imprime el nombre del objeto Address. Estoy buscando valores de objeto de impresión Address también. Si paso person.getAddress() al código anterior, lo imprimo, pero quiero ver todo cuando pase el objeto persona.

¿Alguna sugerencia?

Respuesta

8

Porque no genera toString recursivamente. O busque otra herramienta, o simplemente implemente (o, mejor, IDE-autogenere) el Object#toString() para todos ellos usted mismo.

Por ejemplo:

public class Person { 
    private String name; 
    private Address address; 
    // Add/generate ctors, getters and setters. 

    public String toString() { 
     return String.format("Person[name: %s, %s]", name, address); 
    } 
} 

y

public class Address { 
    private String street; 
    private String city; 
    // Add/generate ctors, getters and setters. 

    public String toString() { 
     return String.format("Address[street: %s, city: %s]", street, city); 
    } 
} 

esta manera la

String personString = person.toString(); 

y

System.out.println(person); 

produciría algo así como

Person[name: goutham, Address[street: Main Street 1, city: New York]] 
3

Puede así definir una clase base para todas sus clases que definirán el método toString de la siguiente manera:

public abstract class MyBaseClass{ 
    public String toString(){ 
    return ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE)); 
    } 
} 

Y a continuación, sólo hacer que sus clases de extenderla . En dicho enfoque, todos los objetos de su dominio podrán generar un buen toString().

+0

Abajo-voto de mí. Las clases de Java solo pueden extender un objeto y hacerlo para que sea un poco más fácil de imprimir me parece criminal. –

5

Usted puede utilizar este método para deshacerse de objetos cada

public static String dump(Object object) { 
    Field[] fields = object.getClass().getDeclaredFields(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(object.getClass().getSimpleName()).append('{'); 

    boolean firstRound = true; 

    for (Field field : fields) { 
     if (!firstRound) { 
      sb.append(", "); 
     } 
     firstRound = false; 
     field.setAccessible(true); 
     try { 
      final Object fieldObj = field.get(object); 
      final String value; 
      if (null == fieldObj) { 
       value = "null"; 
      } else { 
       value = fieldObj.toString(); 
      } 
      sb.append(field.getName()).append('=').append('\'') 
        .append(value).append('\''); 
     } catch (IllegalAccessException ignore) { 
      //this should never happen 
     } 

    } 

    sb.append('}'); 
    return sb.toString(); 
} 

Si hay objetos en el interior del objeto, pasar obj1.obj2 como argumento.

Cuestiones relacionadas