我有一个Java对象,其结构未知。现在我想将此结构(属性及其值)输出到日志文件中。当然,我希望以递归方式完成此操作。是否有任何库可以帮助我?
我有一个Java对象,其结构未知。现在我想将此结构(属性及其值)输出到日志文件中。当然,我希望以递归方式完成此操作。是否有任何库可以帮助我?
XStream 在打印对象图时非常出色,甚至可以处理循环引用,而无需在您的类中进行任何额外的配置或额外的代码(即不需要修改 toString() 方法)。只需添加库,您就可以对任何内容执行此操作并获得漂亮、有用的输出:
log.debug("The object: {}", new XStream().toXML(anyObject));
这将为您提供XML输出。如果您喜欢JSON,可以通过稍微更多的工作来获取它,详见XStream JSON教程。
我建议您查看Apache Commons BeanUtils或Apache Commons Lang,特别是ReflectionToStringBuilder。
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));
你可以使用反射
获取类并遍历每个实例变量,然后继续进行(有些对象可以特别处理(如字符串))
ToStringBuilder.reflectionToString()
非常有用。要实现递归,您可以重写每个对象的 toString() 方法,并调用此函数并传入 this
。
http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/ToStringBuilder.html
Java反射API将使您能够访问所有这些内容(包括私有成员)。要获取私有成员,您需要使用yourObject.getClass().getDeclaredFields()
来访问私有字段,请记得对其调用yourField.setAccesible(true)
。
当然,手动编写自己的类以通过反射执行此操作很快就会遇到问题。主要问题在于尝试决定最终打印一个值并确定它是否为枚举、原始类型、原始类型数组等等。您可以使用Class.isPrimitive方法来帮助解决此步骤。要访问数组的元素,请使用java.lang.reflect.Array类。
最好的选择是使用Apache Commons的ReflectionToStringBuilder,这个选项之前已经发布过了。