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

如何在Java中记录任意对象的内部结构?,java,Java,我有一个结构未知的Java对象。现在我想将这个结构(属性及其值)输出到日志文件中。当然我对递归模式很感兴趣。有什么库可以帮助我吗?Java附带的Java序列化应该可以解决这个问题。它将是二进制格式的 还有XML序列化,可以由提供。我建议您查看Apache Commons BeanUtils或Apache Commons Lang,特别是ReflectionStringBuilder。您可以使用反射 getClass,然后检查每个实例变量并继续(一些对象可以专门处理(如字符串))您应该使用反射。看

我有一个结构未知的Java对象。现在我想将这个结构(属性及其值)输出到日志文件中。当然我对递归模式很感兴趣。有什么库可以帮助我吗?

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


还有XML序列化,可以由

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

您可以使用反射


getClass,然后检查每个实例变量并继续(一些对象可以专门处理(如字符串))

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

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

将允许您访问所有这些内容(私人成员和所有人)。要获取私有成员,您需要获取
yourObject.getClass().getDeclaredFields()
要访问私有字段,请记住对其调用
yourField.setAccessible(true)

当然,如果通过反射手动运行您自己的类来完成此操作,您很快就会遇到问题。当试图决定最终打印一个值并确定它是否是枚举、基元、基元数组等时,会出现主要问题。您可以使用该方法来帮助理解该步骤。要访问数组的元素,请使用类

最好的选择是使用ApacheCommons的功能。

非常擅长打印对象图,即使在类中没有任何额外配置或额外代码的情况下也能处理循环(即,不要弄乱toString())。只需添加库,您就可以对任何内容执行此操作,并获得漂亮、有用的输出:

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

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

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