ToStringBuilder不打印嵌套对象的内容

时间:2010-03-09 22:18:19

标签: java

我正在使用apache commons API(commmons-lang.jar)来打印对象值,如下所示:

ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE))

但是如果对象具有返回另一个对象的getter方法,则此代码不会打印值。

例如,我有Person个对象,它有一个返回Address对象的getter方法。使用上面的代码,它只打印Address对象名称。我也在寻找打印Address对象值。如果我将person.getAddress()传递给上面的代码,它会打印出来,但是当我传递person对象时,我希望看到所有内容。

有什么建议吗?

4 个答案:

答案 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

起可用