2010-03-09 2 views
8

Я cuurently с помощью Apache Commons API (commmons-lang.jar), чтобы напечатать значения объектов, как показано ниже:ToStringBuilder не печатает содержимое вложенных объектов

ToStringBuilder.reflectionToString(object,ToStringStyle.MULTI_LINE_STYLE)) 

Но этот код не печатает значение, если объект имеет метод getter, который возвращает другой объект.

Например, у меня есть объект Person, у него есть метод геттера, который возвращает объект Address. Используя приведенный выше код, он просто печатает имя объекта Address. Я ищу для печати Address значения объекта. Если я пройду person.getAddress() до кода выше, он распечатает это, но я хочу видеть все, когда передаю объект person.

Любые предложения?

ответ

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 могут распространять только один объект и сделать это, чтобы сделать его немного легче для печати, кажется преступным для меня. –

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 в качестве аргумента.

Смежные вопросы