2010-10-11 13 views

Respuesta

5

Puede imprimirlo recursivamente anulando toString en todas sus clases.

Si desea tener un método como printObjectRecursively(Object o), debe sumergirse en la reflexión, buscar los campos, imprimir su nombre y contenido recursivamente usando printObjectRecursively(someField).

Ejemplo:

public class Test { 
    public static void main(String[] args) { 
     A a = new A(); 
     System.out.println(a); 
    } 
} 

class A { 
    int i = 5; 
    B obj = new B(); 
    String str = "hello"; 
    public String toString() { 
     return String.format("A: [i: %d, obj: %s, str: %s]", i, obj, str); 
    } 
} 

class B { 
    int j = 17; 
    public String toString() { 
     return String.format("B: [j: %d]", j); 
    } 
} 

Lienzo:

A: [i: 5, obj: B: [j: 17], str: hello] 

Un método de impresión recursivo basado en la reflexión se podrían escribir algo como esto

private static final List LEAVES = Arrays.asList(
     Boolean.class, Character.class, Byte.class, Short.class, 
     Integer.class, Long.class, Float.class, Double.class, Void.class, 
     String.class); 

public static String toStringRecursive(Object o) throws Exception { 

    if (o == null) 
     return "null"; 

    if (LEAVES.contains(o.getClass())) 
     return o.toString(); 

    StringBuilder sb = new StringBuilder(); 
    sb.append(o.getClass().getSimpleName()).append(": ["); 
    for (Field f : o.getClass().getDeclaredFields()) { 
     if (Modifier.isStatic(f.getModifiers())) 
      continue; 
     f.setAccessible(true); 
     sb.append(f.getName()).append(": "); 
     sb.append(toStringRecursive(f.get(o))).append(" "); 
    } 
    sb.append("]"); 
    return sb.toString(); 
} 
+0

muchas gracias aioobe – tom

+0

Este método me dio un stackoverflowError :) – KjetilNordin

+0

@KjetilNordin tiene razón, la recursión debe evitarse cuando sea posible. Una buena lectura sobre eso en DZone: https://dzone.com/articles/folding-the-universe-part-ii-abstracting-recursion (artículos de "Folding the Universe"). – Benj

0

Debe implementar el método toString para su clases - imprimirá la información sobre los miembros de la clase - usuall y usando sus métodos toString. | A continuación, debe iterar a través de la colección y llamar al toString de cada elemento

0

¿Realmente necesita imprimir esta información? Tal vez ver durante la depuración será suficiente?

0

Puede reemplazar el método toString.

Ejemplo:

class foo 
{ 
int i,j; 

String toString() 
{ 
StringBuilder b=new StringBuilder(); 
return b.append(i).append(j).toString(); 
} 
} 
0

Uso una de las bibliotecas de serialización como Jackson (JSON).

Esto descarga todo en texto sin formato. Si usa un editor compatible con Javascript para embellecer el contenido, con un poco de suerte, en realidad podría tener algún sentido.

Si una gran cantidad de los objetos no son serializable, podría acabar con un montón de galimatías legible, que no ayudará nada, por desgracia,

YMMV

0

He tenido un gran éxito en hacer esto de forma casual utilizando XStream para volcar las representaciones de objetos JSON. Recupera objetos y simplemente parece hacer lo que quiere que haga la mayor parte del tiempo. Y es súper ligero. Ejemplo:

private static final XStream jsonXStream = 
    new XStream(new JsonHierarchicalStreamDriver()); 

public static String toDebugString(Object object) { 
    return jsonXStream.toXML(object); 
    // ignore "toXML" name, it's going to be JSON. 
} 
0

Puede utilizar

ToStringBuilder.reflectionToString (this);

Apache Common Lang contiene la clase ToStringBuilder. Puede definir diferentes estilos con el objeto ToStringStyle.

Cuestiones relacionadas