¿Cómo imprimo el contenido de un objeto recursivamente?Recursivley imprimir detalles de un objeto
Respuesta
Puede imprimirlo recursivamente anulando toString
en todas sus clases.
Si desea tener un método como printObjectRecursively(Object o)
, debe sumergirse en la reflexión, buscar los campos, imprimir su nombre y contenido recursivamente usando printObjectRecursively(someField)
.
Ejemplo:
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);
}
}
Lienzo:
A: [i: 5, obj: B: [j: 17], str: hello]
Un método de impresión recursivo basado en la reflexión se podrían escribir algo como esto
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();
}
muchas gracias aioobe – tom
Este método me dio un stackoverflowError :) – KjetilNordin
@KjetilNordin tiene razón, la recursión debe evitarse cuando sea posible. Una buena lectura sobre eso en DZone: https://dzone.com/articles/folding-the-universe-part-ii-abstracting-recursion (artículos de "Folding the Universe"). – Benj
Debe implementar el método toString
para su clases - imprimirá la información sobre los miembros de la clase - usuall y usando sus métodos toString
. | A continuación, debe iterar a través de la colección y llamar al toString
de cada elemento
¿Realmente necesita imprimir esta información? Tal vez ver durante la depuración será suficiente?
Usted está buscando algo similar a var_dump de PHP, ver si esta pregunta es de ninguna ayuda: What is the Java equivalent of PHP var_dump?
También, echar un vistazo a la reflexión: http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Puede reemplazar el método toString.
Ejemplo:
class foo
{
int i,j;
String toString()
{
StringBuilder b=new StringBuilder();
return b.append(i).append(j).toString();
}
}
Uso una de las bibliotecas de serialización como Jackson (JSON).
Esto descarga todo en texto sin formato. Si usa un editor compatible con Javascript para embellecer el contenido, con un poco de suerte, en realidad podría tener algún sentido.
Si una gran cantidad de los objetos no son serializable, podría acabar con un montón de galimatías legible, que no ayudará nada, por desgracia,
YMMV
He tenido un gran éxito en hacer esto de forma casual utilizando XStream para volcar las representaciones de objetos JSON. Recupera objetos y simplemente parece hacer lo que quiere que haga la mayor parte del tiempo. Y es súper ligero. Ejemplo:
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.
}
Puede utilizar
ToStringBuilder.reflectionToString (this);
Apache Common Lang contiene la clase ToStringBuilder. Puede definir diferentes estilos con el objeto ToStringStyle.
- 1. PHP Imprimir claves de un objeto?
- 2. ¿Imprimir contenido de objeto JavaScript?
- 3. Imprimir todas las propiedades ocultas de un objeto
- 4. ¿Cómo imprimir todo el tipo base de un objeto?
- 5. Imprimir variables y valores en un objeto Groovy
- 6. ¿Cómo imprimir lo que creo que es un objeto?
- 7. Cómo imprimir el objeto/matriz jquery
- 8. Imprimir el objeto jQuery como HTML
- 9. ¿Cómo imprimir la identificación del objeto?
- 10. decorador para imprimir detalles de la llamada función - nombres de los parámetros y valores eficaces
- 11. "Referencia de objeto no configurada para una instancia de un objeto": ¿por qué no puede mostrar .NET más detalles?
- 12. Detalles de call/cc
- 13. Detalles de AsyncWaitHandle.WaitOne
- 14. Imprimir un NSString
- 15. Imprimir un WPF FlowDocument
- 16. ¿Cómo imprimir las propiedades del objeto stdClass en PHP?
- 17. Knockout.js imprimir el índice del objeto en foreach
- 18. ¿Hay alguna forma de imprimir todos los métodos de un objeto en javascript?
- 19. Cómo imprimir recursivamente los valores de las propiedades de un objeto usando la reflexión
- 20. Backbone.js Escenario de detalles maestros
- 21. VBA Recolector de basura Detalles
- 22. Mostrar detalles del importador
- 23. Obtenga los detalles del carrito de compras en Magento
- 24. Missing Índice detalles SQL
- 25. Cómo imprimir la estructura de un objeto R en la consola
- 26. ¿Cómo se puede imprimir un resultado de objeto diferente que str() y repr()?
- 27. ¿Cuántos detalles de hardware puede descubrir un Applet de Java?
- 28. Imprimir un Winform/elemento visual
- 29. Imprimir un proyecto en NetBeans
- 30. iTextSharp para imprimir un gridview
Con el mismo sentido de su pregunta, responderé "Con un método recursivo". –