8
votes

Imprimer récursivement un détail d'objets

Comment imprimer le contenu d'un objet récursivement?


1 commentaires

Avec le même sens de votre question, je répondrai à «avec une méthode récursive».


8 Réponses :


12
votes

Vous pouvez l'imprimer récursivement en remplacement par tostring code> dans toutes vos classes.

Si vous souhaitez avoir une méthode comme printObjectRecursivement (objet O) code> Vous devez plonger Dans la réflexion, récupérez les champs, imprimez leur nom et leur contenu à l'aide de printObjectRecursivement (quelquefield) code>. p>

Exemple: P>

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


4 commentaires

Cette méthode m'a donné un stackoverflowerror :)


@KJetilnordin a raison, la récursion devrait être évitée lorsque cela est possible. Une belle lecture à ce sujet sur dzone: dzone.com/articles/ ... ("Pliant l'univers" Articles).


@Benj, c'était probablement parce que Kjetilnordin avait une boucle dans son graphique. Si cela avait été fait aussi naïfité de manière itérative, le programme n'aurait pas résilié (ou s'est écrasé à cause d'une Oome). Je pense que c'est parfaitement bien de résoudre ce type de problème de récursivité.


@aioobe, je conviens que ce processus ne devrait pas non plus sur "tous les jours d'objets", mais j'essaie d'éviter la récursion quand je peux (mais c'est un IMHO). Je suis totalement d'accord avec votre code à des fins de débogage, vous avez fourni une solution intelligente pour les graphiques non cycliques. Je l'utilise depuis hier, ça marche bien, merci :)



0
votes

Vous devez implémenter la méthode tostring pour vos classes - il imprimera les informations sur les membres de la classe - en utilisant généralement leurs méthodes tostring . | Ensuite, vous coupez la jonction à travers la collection et appelez tostring de chaque élément


0 commentaires

0
votes

Avez-vous vraiment besoin d'imprimer ces informations? Peut-être que regarder pendant le débogage suffiront?


0 commentaires

0
votes

Vous recherchez quelque chose de similaire à PHP's Var_Dummp, voir si cette question est de toute aide: Quel est l'équivalent Java de php var_dump?

Aussi, consultez la réflexion: http: //java.sun. Com / Developer / TechnicalArticles / Alt / Réflexion /


0 commentaires

0
votes

Vous pouvez remplacer la méthode de tostring.

Exemple: xxx


0 commentaires

0
votes

Utilisez l'une des bibliothèques de sérialisation comme jackson (JSON).

Cela décharge tout en texte clair. Si vous utilisez un éditeur capable JavaScript pour inscrire le contenu, avec un peu de chance, vous pourriez en réalité un peu de chance.

Si beaucoup d'objets ne sont pas sérialisables, vous risquez de vous retrouver avec beaucoup de gibberish lisible qui n'aidera pas quoi que ce soit, malheureusement,

ymmv


0 commentaires

1
votes

J'ai eu un grand succès en faisant cela sur une base occasionnelle en utilisant Xtream pour vider les représentations JSON d'objets. Il recouvre des objets et semble tout simplement faire ce que vous voulez faire la plupart du temps. Et c'est super léger. Exemple: xxx


0 commentaires

2
votes

Vous pouvez utiliser:

ToStringBuilder.reflectionToString(this);


0 commentaires