2010-03-09 51 views
8

我cuurently使用Apache公地API(commmons-lang.jar)打印对象的值嵌套对象的内容该对象有一个返回另一个对象的getter方法。ToStringBuilder不打印

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

有什么建议吗?

回答

8

因为它不递归生成toString。要么寻找其他工具,要么自己实施(或更好地,IDE-自动生成)所有人的Object#toString()

例如:

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]] 
3

可以和定义一个基类的所有类,将通过以下方式定义toString方法:

public abstract class MyBaseClass{ 
    public String toString(){ 
    return ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE)); 
    } 
} 

然后就是让你的类来扩展它。 在这种方法中,您的所有域对象都将能够生成一个很好的toString()。

+0

向我投票。 Java类只能扩展一个对象,并且为了使它更容易打印而对我来说似乎是犯罪的。 – 2015-03-19 12:15:59

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作为参数。