Tengo un objeto Java con una estructura desconocida. Ahora quiero enviar esta estructura (propiedades y sus valores) al archivo de registro. Y, por supuesto, estoy interesado en hacer esto en modo recursivo. ¿Hay alguna biblioteca que pueda ayudarme?¿Cómo registrar elementos internos de un objeto arbitrario en Java?
Respuesta
XStream es extremadamente bueno en la impresión de gráficos de objetos, incluso ciclos de manejo sin ninguna configuración adicional o código adicional en sus clases (es decir, no jugar con toString() 's). Simplemente agregue la biblioteca y puede hacer esto para cualquier cosa y obtener resultados agradables y útiles:
log.debug("The object: {}", new XStream().toXML(anyObject));
Eso le dará salida XML. Si prefiere JSON, puede obtenerlo con un poco más de trabajo como se detalla en el XStream JSON tutorial.
La serialización de Java, que viene con Java, debería hacer el truco. Sin embargo, estará en formato binario.
También hay serialización XML que puede ser proporcionada por JAXB
le sugiero que busque, ya sea en Apache Commons BeanUtils o Apache Commons Lang, específicamente ReflectionToStringBuilder.
se podía utilizar la reflexión
getClass y luego ir en cada variable de instancia y seguir adelante (algunos objetos pueden ser manejados en concreto (como cadenas))
Debe utilizar la reflexión. Eche un vistazo a la clase java.lang.Class
, específicamente al método .getFields()
.
He encontrado el Apache Commons ToStringBuilder.reflectionToString()
muy útil. Para obtener recursividad, puede anular el método toString() de cada objeto con una llamada a esta función pasando this
.
http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/ToStringBuilder.html
tenga cuidado con los ciclos en el gráfico de objetos ... –
El java reflection API le dará acceso a todas estas cosas (los miembros privados y todo). Para obtener miembros privados, necesitará obtener yourObject.getClass().getDeclaredFields()
para acceder a un campo privado, recuerde llamar al yourField.setAccesible(true)
en él.
Por supuesto, rápidamente tendrá problemas manejando su propia clase para hacer esto a través de la reflexión. Los problemas principales aparecen cuando se intenta decidir finalmente imprimir un valor y determinar si se trata de una enumeración, una primitiva, una matriz primitiva, etc. Puede usar el método Class.isPrimitive para ayudar a entender ese paso. Para acceder a los elementos de una matriz, use la clase java.lang.reflect.Array.
La mejor opción, que se publicó anteriormente, es utilizar el ReflectionToStringBuilder de apache commons.
Un serializador json hará el trabajo, p. usando Gson:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
...
private static final Logger LOG = LoggerFactory.getLogger(Your.class);
...
Object obj = ...;
LOG.info(new Gson().toJson(obj));
- 1. detectar objetos internos en un objeto scala
- 2. ¿Cómo puedo copiar profundamente un objeto arbitrario en GWT?
- 3. ¿Cómo registrar un objeto traductor de Pylons?
- 4. Dado un objeto javascript arbitrario, ¿cómo puedo encontrar sus métodos?
- 5. Referencia canónica en elementos internos de JVM para programadores/desarrolladores
- 6. Obtenga el VK int de un carácter arbitrario en java
- 7. ¿Cómo puedo registrar un elemento HTML como un objeto JavaScript?
- 8. QuadTrees: cómo actualizar cuándo se mueven los elementos internos
- 9. Cómo registrar un QueryExecuterFactory en informes jasper en java
- 10. ¿Cómo imprimir/registrar una matriz de cadena en Java?
- 11. Cómo combinar un número arbitrario de tuplas en Python?
- 12. Rock Paper Scissors para el número impar arbitrario de elementos
- 13. Cómo ejecutar un método de objeto arbitrario de una cadena en ruby?
- 14. consulta SQL multiplicando resultado SUM cantidad de elementos internos
- 15. Cómo abatir un objeto Java?
- 16. recolección de elementos de un objeto específico
- 17. ¿Cómo eliminar texto (sin quitar elementos internos) de un elemento padre usando jQuery
- 18. Registros internos para Castle Windsor
- 19. Cómo decorar un objeto en Java
- 20. Enhebrado en Java: cómo bloquear un objeto?
- 21. ¿Cómo se suman varios elementos en un objeto en PowerShell?
- 22. ¿Admite Java métodos internos/locales/secundarios?
- 23. ¿Cómo se manejan los datos R internos de un paquete?
- 24. El radio del borde no afecta a los elementos internos
- 25. ¿Cómo puedo hacer un objeto JS llamable con un prototipo arbitrario?
- 26. Copie un objeto en Java
- 27. java log4j elegir qué archivo registrar en
- 28. ¿Cómo registrar automáticamente la entrada/salida de métodos en Java?
- 29. ¿Cómo registrar una devolución de llamada de JavaScript en un Applet de Java?
- 30. ¿Cómo puedo pasar un objeto arbitrario al informe de jaspe como parámetro?
¿Cree que el formato binario es adecuado para un archivo de registro? :) – yegor256
Buen punto. Acabo de agregar un enlace a JAXB. –