Что такое Java-эквивалент PHP var_dump?


127

В PHP есть функция var_dump (), которая выводит внутреннее содержимое объекта, показывая тип и содержимое объекта.

Например:

class Person {
  private $firstName;
  private $lastName;

  public function __construct($firstName, $lastName) {
    $this->firstName = $firstName;
    $this->lastName = $lastName;
  }
}

$person = new Person('Jon', 'Smith');
var_dump($person);

выведет:

object(Person)#1 (2) {
  ["firstName:private"]=>
  string(3) "Jon"
  ["lastName:private"]=>
  string(5) "Smith"
}

Какой эквивалент в Java будет делать то же самое?


1
вы пробовали db4o? это не специально для этого, но я думаю будет работать отлично;
Сила Водолея

Ответы:


67

Это не так встроено в Java, поэтому вы не получите это бесплатно. Это делается с помощью соглашений, а не языковых конструкций. Во всех классах передачи данных (и, возможно, даже во всех классах, которые вы пишете ... ), вы должны реализовать разумный toStringметод. Итак, здесь вам нужно переопределить toString()в своем Personклассе и вернуть желаемое состояние.

Есть утилиты , помогающие написать хороший метод toString, или в большинстве IDE есть toString()ярлык для автоматической записи.



См. Также stackoverflow.com/questions/9444573/… альтернативу Guava и шаблон Intellij IDEA.
Вадим

31

По моему опыту, var_dump обычно используется для отладки PHP вместо пошагового отладчика. В Java вы, конечно, можете использовать отладчик вашей IDE, чтобы увидеть визуальное представление содержимого объекта.


10
Юпс, большинство PHP или веб-разработчиков забывают об отладке. Потому что они предпочитают видеть результат отладки в браузере.
GusDeCooL 04

10
Вы не можете использовать отладчик своей IDE, если, например, вы программируете код JSP в редакторе Adobe Experience Manager на основе браузера. :(
Trevor

Возможно, мы сможем использовать его для проверки поведения вашей программы в реальной среде, распечатав vardump в формате html.
omjego

18

Ваши альтернативы - переопределить toString()метод вашего объекта для вывода его содержимого так, как вам нравится, или использовать отражение для проверки объекта (аналогично тому, как это делают отладчики).

Преимущество использования отражения состоит в том, что вам не нужно изменять ваши отдельные объекты, чтобы они были «анализируемыми», но это добавляет сложности, и если вам нужна поддержка вложенных объектов, вам придется это написать.

Этот код перечислит поля и их значения для символа Object«o».

Field[] fields = o.getClass().getDeclaredFields();
for (int i=0; i<fields.length; i++)
{
    System.out.println(fields[i].getName() + " - " + fields[i].get(o));
}

какое это поле вы используете, откуда импортировано?
RMiranda

3
java.lang.reflect.Field
Гарри Лайм

17

Я думаю, что лучший способ сделать это - использовать google-gson (библиотека Java для преобразования JSON в объекты Java и наоборот)

Загрузите его, добавьте в свой проект файл "jar"

HashMap<String, String> map = new HashMap<String, String>();

map.put("key_1", "Baku");
map.put("key_2", "Azerbaijan");
map.put("key_3", "Ali Mamedov");

Gson gson = new Gson();

System.out.println(gson.toJson(map));

Вывод:

{"key_3":"Ali Mamedov","key_2":"Azerbaijan","key_1":"Baku"}

Вы можете преобразовать любой объект (массивы, списки и т. Д.) В JSON. Я считаю, что это лучший аналог PHP var_dump ()


4
Интересно ... знаете, почему это не статический метод?
mirelon

2
Вы можете использовать его как статический метод: new Gson (). ToJson (...) без создания новых переменных.
Али Мамедов

Imo, лучше, если вы абстрагируете его в пользовательский служебный класс, а не используете его напрямую, это дает вам гибкость для управления сторонними зависимостями
MAYOBYO HASSAN

7

Пакет apache commons lang предоставляет такой класс, который можно использовать для создания метода toString () по умолчанию с использованием отражения для получения значений полей. Вы только посмотрите на это .



Обе эти ссылки мертвы
beiller


4

Мне нравится использовать GSON, потому что это часто уже зависит от типа проектов, над которыми я работаю:

public static String getDump(Object o) {
    return new GsonBuilder().setPrettyPrinting().create().toJson(o);
}

Или замените GSON на любую другую используемую вами библиотеку JSON.



0

Вы выполняете сериализацию XML, и вы должны получить очень четкое представление даже для глубоко вложенных объектов.


0

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

public static void dd(Object obj) { System.out.println(obj); }

Это не то же самое, что var_dump (), но вы можете получить общее представление о нем без необходимости переходить в IDE отладчика.


0

Просто добавьте в решение Field (setAccessible), чтобы вы могли получить доступ к частной переменной объекта:

public static void dd(Object obj) throws IllegalArgumentException, IllegalAccessException {
    Field[] fields = obj.getClass().getDeclaredFields();
    for (int i=0; i<fields.length; i++)
    {
        fields[i].setAccessible(true);
        System.out.println(fields[i].getName() + " - " + fields[i].get(obj));
    } 

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.