ToStringBuilder不打印嵌套对象的内容

gou*_*ham 9 java

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

ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE))
Run Code Online (Sandbox Code Playgroud)

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

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

有什么建议?

Asa*_*Asa 9

从Apache Commons Lang 3.2 版本RecursiveToStringStyle开始,您可以使用 a来实现您想要的效果。

任何一个:

ToStringBuilder.reflectionToString(object, new RecursiveToStringStyle());
Run Code Online (Sandbox Code Playgroud)

或者

ToStringBuilder.reflectionToString(object, new MultilineRecursiveToStringStyle());
Run Code Online (Sandbox Code Playgroud)

MultilineRecursiveToStringStyle从3.4 版本开始可用


Bal*_*usC 8

因为它不会toString递归生成.要么寻找另一个工具,要么Object#toString()自己实现所有这些工具(或者更好的IDE自动生成).

例如:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样的

String personString = person.toString();
Run Code Online (Sandbox Code Playgroud)

System.out.println(person);
Run Code Online (Sandbox Code Playgroud)

会产生类似的东西

Person[name: goutham, Address[street: Main Street 1, city: New York]]
Run Code Online (Sandbox Code Playgroud)


Jun*_*Jun 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();
}
Run Code Online (Sandbox Code Playgroud)

如果对象内有对象,则传递obj1.obj2作为参数.