Comment imprimer le contenu d'un objet récursivement? p>
8 Réponses :
Vous pouvez l'imprimer récursivement en remplacement par Si vous souhaitez avoir une méthode comme Exemple: P> tostring code> dans toutes vos classes. 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> 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();
}
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 :)
Vous devez implémenter la méthode code> tostring code> pour vos classes - il imprimera les informations sur les membres de la classe - en utilisant généralement leurs méthodes tostring code>. | Ensuite, vous coupez la jonction à travers la collection et appelez tostring code> de chaque élément p>
Avez-vous vraiment besoin d'imprimer ces informations? Peut-être que regarder pendant le débogage suffiront? P>
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? P>
Aussi, consultez la réflexion: http: //java.sun. Com / Developer / TechnicalArticles / Alt / Réflexion / P>
Vous pouvez remplacer la méthode de tostring.
Exemple: strong> p>
Utilisez l'une des bibliothèques de sérialisation comme jackson (JSON). p>
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. P>
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, p>
ymmv p>
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:
Vous pouvez utiliser:
ToStringBuilder.reflectionToString(this);
Avec le même sens de votre question, je répondrai à «avec une méthode récursive».