31 Stimmen

Java toString - ToStringBuilder nicht ausreichend; wird nicht durchlaufen

Ich muss in der Lage sein, meinen gesamten Objektgraphen zu durchlaufen und alle Inhalte aller Mitgliedsfelder zu protokollieren.

Zum Beispiel: Objekt A hat eine Sammlung von Objekten B, die eine Sammlung von Objekten C haben, und A, B, C haben zusätzliche Felder usw.

Apache Commons ToStringBuilder ist nicht ausreichend, da es weder einen Objektgraphen durchläuft noch den Inhalt einer Sammlung ausgibt.

Kennt jemand eine andere Bibliothek, die dies tun wird oder haben einen Code-Schnipsel, die dies tut?

0voto

BestPractices Punkte 12441

Dieser Link hat sich als guter Ausgangspunkt erwiesen. Sie benötigen im Grunde etwas, das rekursiv ist, aber nicht in zyklischen Verweisen verloren gehen wird (Objekt A hat einen Verweis auf Objekt B, das einen Verweis zurück auf Objekt A hat; Sie wollen nicht stecken bleiben, dass immer und immer wieder durchlaufen).

http://www.java2s.com/Code/Java/Class/Constructsprettystringrepresentationofobjectvalue.htm

Dies war ebenfalls recht hilfreich

http://binkley.blogspot.com/2007/08/recursive-tostring.html

0voto

Milan Punkte 665

Erweiterter obiger Code für Liste und Karte:

Code:

public class MultipleRecursiveToStringStyle extends ToStringStyle {
private static final int    INFINITE_DEPTH  = -1;

private int                 maxDepth;

private int                 depth;

public MultipleRecursiveToStringStyle() {
    this(INFINITE_DEPTH);
}

public MultipleRecursiveToStringStyle(int maxDepth) {
    setUseShortClassName(true);
    setUseIdentityHashCode(false);

    this.maxDepth = maxDepth;
}

@Override
protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
    if (value.getClass().getName().startsWith("java.lang.")
            || (maxDepth != INFINITE_DEPTH && depth >= maxDepth)) {
        buffer.append(value);
    } else {
        depth++;
        buffer.append(ReflectionToStringBuilder.toString(value, this));
        depth--;
    }
}

@Override
protected void appendDetail(StringBuffer buffer, String fieldName, Collection<?> coll) {
    Collections.sort((List<Comparable>) coll);
    for(Object value: coll){
        if (value.getClass().getName().startsWith("java.lang.")
                || (maxDepth != INFINITE_DEPTH && depth >= maxDepth)) {
            buffer.append(value);
        } else {
            depth++;
            buffer.append(ReflectionToStringBuilder.toString(value, this));
            depth--;
        }
    }
}

@Override
protected void appendDetail(StringBuffer buffer, String fieldName, Map<?, ?> map) {
    TreeMap<?,?> sortedMap = new TreeMap<Object, Object>(map);
    for(Map.Entry<?,?> kvEntry: sortedMap.entrySet()){
        Object value = kvEntry.getKey();
        if (value.getClass().getName().startsWith("java.lang.")
                || (maxDepth != INFINITE_DEPTH && depth >= maxDepth)) {
            buffer.append(value);
        } else {
            depth++;
            buffer.append(ReflectionToStringBuilder.toString(value, this));
            depth--;
        }
        value = kvEntry.getValue();
        if (value.getClass().getName().startsWith("java.lang.")
                || (maxDepth != INFINITE_DEPTH && depth >= maxDepth)) {
            buffer.append(value);
        } else {
            depth++;
            buffer.append(ReflectionToStringBuilder.toString(value, this));
            depth--;
        }
    }
}}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X