如何在Java中记录任意对象的内部?

时间:2011-07-15 18:16:17

标签: java

我有一个具有一些未知结构的Java对象。现在我想将此结构(属性及其值)输出到日志文件。当然,我有兴趣以递归模式执行此操作。有没有可以帮助我的图书馆?

8 个答案:

答案 0 :(得分:6)

XStream非常擅长打印对象图,甚至可以在你的类中没有任何额外配置或额外代码的情况下处理周期(即没有搞乱toString())。只需添加库,你就可以做任何事情并得到漂亮,有用的输出:

log.debug("The object: {}", new XStream().toXML(anyObject));

这将为您提供XML输出。如果您更喜欢JSON,那么您可以通过XStream JSON tutorial中详述的更多工作来获得它。

答案 1 :(得分:4)

我建议您查看Apache Commons BeanUtils或Apache Commons Lang,特别是ReflectionToStringBuilder。

答案 2 :(得分:0)

Java附带的Java序列化应该可以解决问题。它虽然是二进制格式。

还有JAXB

提供的XML序列化

答案 3 :(得分:0)

你可以使用反射

getClass然后遍历每个实例变量并继续(某些对象可以专门处理(如字符串))

答案 4 :(得分:0)

你应该使用反射。请查看java.lang.Class类,特别是.getFields()方法。

答案 5 :(得分:0)

我发现Apache Commons ToStringBuilder.reflectionToString()非常有用。要获得递归,您可以通过调用此函数传递this来覆盖每个Object的toString()方法。

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/ToStringBuilder.html

答案 6 :(得分:0)

java reflection API将允许您访问所有这些内容(私人成员和所有内容)。要获得私人会员,您需要yourObject.getClass().getDeclaredFields()访问私人字段,请记得在其上调用yourField.setAccesible(true)

当然,你很快就会通过手工操作自己的课程来解决问题。当试图决定最终打印一个值并确定它是枚举,基元,原始数组等时,会出现主要问题。您可以使用Class.isPrimitive方法帮助确定该步骤。要访问数组的元素,请使用java.lang.reflect.Array类。

之前发布的最佳选择是使用apache commons的ReflectionToStringBuilder

答案 7 :(得分:0)

json序列化程序将完成这项工作,例如使用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));