Как полностью печатать Java Bean с помощью отражения или любой другой утилиты

У меня есть Java bean class Person, содержащий 3 переменные:

  • name (String)
  • age (String)
  • адрес (объект).

Address содержит 3 переменные:

  • улица
  • door_no
  • город

Я хотел бы иметь утилиту, которая должна печатать все переменные в Person.

Под этим я подразумеваю, что он должен печатать Person, а также содержащийся в нем объект Address.

Я мог бы создать хэш-карту и поместить имена переменных и значения с помощью отображения и отображения ключа/значения в пользовательском интерфейсе JSP, но проблема в том, что я должен применить отражение для Address, чтобы добавить переменную/значение в hashmap.

Есть ли доступная утилита для этого?

Ответ 1

Вы можете использовать ToStringBuilder из Apache Commons.

Из документации:

Типичный вызов для этого метода будет выглядеть так:

 public String toString() {
   return ToStringBuilder.reflectionToString(this);
 }

Подробнее:

Этот класс позволяет создать хороший и последовательный toString() для любой класс или объект. Этот класс предназначен для упрощения процесса:

позволяет имена полей обрабатывать все типы, последовательно обрабатывая нули последовательный вывод массивов и многомерных массивов уровень детализации, который необходимо контролировать для обработки объектов и коллекций иерархии классов. Чтобы использовать этот класс, напишите код следующим образом:

 public class Person {
   String name;
   int age;
   boolean smoker;

   ...

   public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       append("smoker", smoker).
       toString();
   }
 }

В качестве альтернативы существует метод, который использует отражение для определения поля для проверки. Поскольку эти поля обычно являются частными, метод, reflectionToString, использует AccessibleObject.setAccessible для изменения видимость полей. Это приведет к сбою под управлением безопасности, если соответствующие разрешения не установлены правильно. Это также медленнее, чем тестирование явно. Типичный вызов для этого метода будет выглядеть так:

 public String toString() {
   return ToStringBuilder.reflectionToString(this);
 }

Ответ 3

Вы можете реализовать метод toString, чтобы распечатать все, что захотите, или вы можете использовать Apache Commons ToStringBuilder http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/ToStringBuilder.html и его метод reflectionToString. Я не верю, что это повторится через свойства (например, адрес), но если вы хотите увидеть адрес, распечатанный с помощью Street, Door No и City, используйте метод toString, чтобы распечатать эту информацию.

Ответ 4

Вы можете найти полезный для этой цели Jackson JSON serializer. Библиотека Jackson уже может быть частью вашего стека. Если нет, найдите необходимые зависимости ниже.

private static final ObjectMapper OBJECT_MAPPER_SINGLETON = new ObjectMapper();
public static String toStringUsingJackson(final Object object) {
    try {
        return OBJECT_MAPPER_SINGLETON.writeValueAsString(object);
    } catch (final JsonProcessingException e) {
        return String.valueOf(object);
    }
}

Пример вывода:

{ "name": "John Doe", "age": 42}

Обязательные зависимостей maven/ gradle:

  • jackson-core, groupId = com.fasterxml.jackson.core
  • jackson-databind, groupId = com.fasterxml.jackson.core