Wie drucke ich den Inhalt eines Objekts rekursiv?Recursivley Drucken Sie eine Objekte Details
Antwort
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();
}
Vielen Dank aioobe – tom
Diese Methode gab mir einen StackoverflowError :) – KjetilNordin
@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
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
Möchten Sie diese Informationen wirklich ausdrucken? Vielleicht zu sehen, während debbuging wird genug sein?
Sie suchen etwas ähnliches wie PHP Var_dump, ob diese Frage keine Hilfe ist: What is the Java equivalent of PHP var_dump?
Auch einen Blick auf Reflexion: http://java.sun.com/developer/technicalArticles/ALT/Reflection/
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();
}
}
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
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.
}
Sie
ToStringBuilder.reflectionToString verwenden (diese);
Apache Common Lang enthält die ToStringBuilder-Klasse. Sie können mit dem ToStringStyle-Objekt einen anderen Stil definieren.
- 1. JavaFX Drucken nicht Knoten Objekte
- 2. Drucken Sie eine GUID-Variable
- 3. Drucken Sie eine Binary Tree
- 4. So drucken Sie eine Werteliste?
- 5. Drucken Sie eine sqlalchemy Zeile
- 6. Node.js Istanbul/Mocha Unit Tests, die keine Details drucken
- 7. So drucken Sie JSON-Objekte in DB mit Node-orm2
- 8. Wie numpy Objekte ohne Zeile drucken bricht
- 9. Recursivley Test, wenn ein binärer Suchbaum abgeschlossen ist
- 10. Eine Seite drucken, ohne sie anzuzeigen?
- 11. VBA Drucken Sie eine dreidimensionale Daten
- 12. Drucken Sie eine Rasteransicht in mehreren Seiten
- 13. So drucken Sie eine Rasteransicht mit iTextSharp
- 14. Drucken Sie eine definierte Variable mit Erhaltung $
- 15. So drucken Sie Befehlszeilenargumente in eine Datei
- 16. PDF.js Wie drucken Sie eine mehrseitige PDF?
- 17. Drucken Sie eine HTML-Datei mit VBA
- 18. Drucken Sie eine Seite mit xslt
- 19. So drucken Sie eine Liste von Tupeln
- 20. Erstellen Sie eine Karte, die Details zu schweben zeigt
- 21. Google Ansichten - Holen Sie sich Fotos Details für eine Region
- 22. Machen Sie eine Aktivität für mehrere Objekte
- 23. Konvertieren Sie eine Liste in JSON-Objekte
- 24. Eine Protokolldatei lesen und spezifische Details finden
- 25. Eine Liste in einer Liste drucken
- 26. Machen Sie C# -Montageattribut in Details anzeigen
- 27. Machen Sie Objekte clos in lisp druckbar
- 28. Lesen Sie SSL Certificate Details auf WP8
- 29. Drucken Sie Umgebungsvariable
- 30. Drucken Sie ein EObject?
Mit dem gleichen Sinn Ihrer Frage werde ich "mit einer rekursiven Methode" antworten. –