反射转储java对象的属性
是否有递归转储/打印对象属性的库?我正在寻找类似Firebug中的console.dir()函数的东西
我知道commons langReflectionToStringBuilder,但它不会递归到对象中。即,如果我运行以下操作:
public class ToString {
public static void main(String [] args) {
System.out.println(ReflectionToStringBuilder.toString(new Outer(), ToStringStyle.MULTI_LINE_STYLE));
}
private static class Outer {
private int intValue = 5;
private Inner innerValue = new Inner();
}
private static class Inner {
private String stringValue = "foo";
}
}
我收到:
ToString$Outer@1b67f74[ intValue=5
innerValue=ToString$Inner@530daa ]
我意识到在我的示例中,我可以重写内部的toString()方法,但在现实世界中,我处理的是无法修改的外部对象
# 1 楼答案
这将打印出对象的所有字段(包括对象数组)
修正了来自this thread的Ben Williams post版本
注意:这个方法使用递归,所以如果你有一个非常深的对象图,你可能会得到堆栈溢出(没有双关语;)如果是这样,您需要使用VM参数-Xss10m。如果您使用eclipse将其置于运行状态>;运行配置>;增强(选项卡)VM增强框并按应用
# 2 楼答案
您应该使用RecursiveToString样式:
# 3 楼答案
我想要一个优雅的解决方案来解决这个问题:
我编写了以下实用程序类:
我在很多课堂上进行了测试,对我来说非常有效。例如,尝试使用它转储主线程:
编辑
自从写了这篇文章,我就有理由创建这个算法的迭代版本。递归版本在深度上受到总堆栈帧的限制,但是您可能有理由转储一个非常大的对象图。为了处理我的情况,我修改了算法,用堆栈数据结构代替运行时堆栈。此版本具有时间效率,并且受堆大小而不是堆栈帧深度的限制
您可以下载并使用iterative version here
# 4 楼答案
你可以试试XStream
打印出:
您还可以在JSON中输出
注意循环引用;)
# 5 楼答案
我试着按照最初的建议使用XStream,但结果是我想要转储的对象图包含了一个对XStream封送器本身的引用,对此我并不太乐意(我不确定为什么它必须抛出一个异常,而不是忽略它或记录一个好的警告)
然后我尝试了上面user519500的代码,但发现我需要一些调整。以下是一个类,您可以将其应用到提供以下额外功能的项目中:
[<classname>][:<fieldname>]
您可以使用以下两种方法之一调用此函数:
如上所述,您需要小心堆栈溢出,因此使用最大递归深度工具将风险降至最低
希望有人会觉得这很有用
# 6 楼答案
您可以将ReflectionStringBuilder与自定义ToString样式一起使用,例如:
然后你像这样调用它:
不过要注意循环引用
您还可以使用json库(http://json-lib.sourceforge.net),只需执行以下操作: