我正在使用apache commons API(commmons-lang.jar)来打印对象值,如下所示:
ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE))
但是如果对象具有返回另一个对象的getter方法,则此代码不会打印值。
例如,我有Person
个对象,它有一个返回Address
对象的getter方法。使用上面的代码,它只打印Address
对象名称。我也在寻找打印Address
对象值。如果我将person.getAddress()
传递给上面的代码,它会打印出来,但是当我传递person对象时,我希望看到所有内容。
有什么建议吗?
答案 0 :(得分:8)
因为它不会递归生成toString
。要么寻找另一个工具,要么自己为Object#toString()
实现(或更好地,IDE-自动生成){/ 1}}。
例如:
public class Person {
private String name;
private Address address;
// Add/generate ctors, getters and setters.
public String toString() {
return String.format("Person[name: %s, %s]", name, address);
}
}
和
public class Address {
private String street;
private String city;
// Add/generate ctors, getters and setters.
public String toString() {
return String.format("Address[street: %s, city: %s]", street, city);
}
}
这样
String personString = person.toString();
和
System.out.println(person);
会产生类似
的东西Person[name: goutham, Address[street: Main Street 1, city: New York]]
答案 1 :(得分:5)
您可以使用此方法转储每个对象
public static String dump(Object object) {
Field[] fields = object.getClass().getDeclaredFields();
StringBuilder sb = new StringBuilder();
sb.append(object.getClass().getSimpleName()).append('{');
boolean firstRound = true;
for (Field field : fields) {
if (!firstRound) {
sb.append(", ");
}
firstRound = false;
field.setAccessible(true);
try {
final Object fieldObj = field.get(object);
final String value;
if (null == fieldObj) {
value = "null";
} else {
value = fieldObj.toString();
}
sb.append(field.getName()).append('=').append('\'')
.append(value).append('\'');
} catch (IllegalAccessException ignore) {
//this should never happen
}
}
sb.append('}');
return sb.toString();
}
如果对象内有对象,则传递obj1.obj2作为参数。
答案 2 :(得分:3)
您还可以通过以下方式为将定义toString方法的所有类定义基类:
public abstract class MyBaseClass{
public String toString(){
return ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE));
}
}
然后让你的课程扩展它。 在这种方法中,所有域对象都能够生成一个很好的toString()。
答案 3 :(得分:0)
自Apache Commons Lang的 3.2版以来,您可以使用 RecursiveToStringStyle
来实现所需的功能。
要么:
ToStringBuilder.reflectionToString(object, new RecursiveToStringStyle());
或
ToStringBuilder.reflectionToString(object, new MultilineRecursiveToStringStyle());
MultilineRecursiveToStringStyle
自版本3.4