2010-10-11 5 views

Antwort

5

Sie können es rekursiv drucken, indem Sie in allen Ihren Klassen überschreiben.

Wenn Sie eine Methode wie printObjectRecursively(Object o) haben wollen, müssen Sie in Reflexion tauchen, holen Sie die Felder, drucken Sie ihren Namen und Inhalt rekursiv mit printObjectRecursively(someField).

Beispiel:

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

Drucke:

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

Eine Reflexion basierende rekursive Druckverfahren so etwas wie dieses

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

Vielen Dank aioobe – tom

+0

Diese Methode gab mir einen StackoverflowError :) – KjetilNordin

+0

@KjetilNordin ist richtig, Rekursion sollte möglichst vermieden werden. Eine nette Lektüre dazu auf DZone: https://dzone.com/articles/folding-the-universe-part-ii-abstracting-recursion (Artikel "Folding the Universe"). – Benj

0
geschrieben werden konnte

Sie sollten die toString Methode für Ihre Implementierung Klassen - es wird die Informationen über die Klassenmitglieder drucken - usuall y mit ihren toString Methoden. | Dann just iterate durch die Sammlung und rufen Sie toString von jedem Artikel

0

Möchten Sie diese Informationen wirklich ausdrucken? Vielleicht zu sehen, während debbuging wird genug sein?

0

Sie können die toString-Methode überschreiben.

Beispiel:

class foo 
{ 
int i,j; 

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

Verwenden einer der Serialisierung Bibliotheken wie Jackson (JSON).

Dies dumpt alles im Klartext. Wenn Sie einen Javascript-fähigen Editor verwenden, um den Inhalt zu verschönern, können Sie mit ein bisschen Glück tatsächlich Sinn machen.

Wenn viele der Objekte nicht serialisierbar sind, können Sie mit vielen lesbaren Kauderwelsch könnten am Ende, die nichts helfen werden leider

YMMV

0

Ich habe dies auf großen Erfolg zu tun habe eine zufällige Basis, die XStream verwendet, um JSON-Darstellungen von Objekten zu speichern. Es rezesziert Objekte und scheint nur das zu tun, was es die meiste Zeit tun soll. Und es ist superleicht. Beispiel:

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

Sie

ToStringBuilder.reflectionToString verwenden (diese);

Apache Common Lang enthält die ToStringBuilder-Klasse. Sie können mit dem ToStringStyle-Objekt einen anderen Stil definieren.