我当然使用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对象时我希望看到所有内容.
有什么建议?
从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 版本开始可用
因为它不会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)
您可以使用此方法转储每个对象
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作为参数.