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