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

6

我有一个Java对象,其结构未知。现在我想将此结构(属性及其值)输出到日志文件中。当然,我希望以递归方式完成此操作。是否有任何库可以帮助我?

8个回答

6

XStream 在打印对象图时非常出色,甚至可以处理循环引用,而无需在您的类中进行任何额外的配置或额外的代码(即不需要修改 toString() 方法)。只需添加库,您就可以对任何内容执行此操作并获得漂亮、有用的输出:

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

这将为您提供XML输出。如果您喜欢JSON,可以通过稍微更多的工作来获取它,详见XStream JSON教程


5

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



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

0

Java序列化是Java自带的,应该可以胜任。但它将以二进制格式呈现。

还有一种XML序列化,可以由JAXB提供。


0

你可以使用反射

获取类并遍历每个实例变量,然后继续进行(有些对象可以特别处理(如字符串))


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

0

0

Java反射API将使您能够访问所有这些内容(包括私有成员)。要获取私有成员,您需要使用yourObject.getClass().getDeclaredFields()来访问私有字段,请记得对其调用yourField.setAccesible(true)

当然,手动编写自己的类以通过反射执行此操作很快就会遇到问题。主要问题在于尝试决定最终打印一个值并确定它是否为枚举、原始类型、原始类型数组等等。您可以使用Class.isPrimitive方法来帮助解决此步骤。要访问数组的元素,请使用java.lang.reflect.Array类。

最好的选择是使用Apache Commons的ReflectionToStringBuilder,这个选项之前已经发布过了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接