Що таке 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

10
Ви не можете використовувати налагоджувач IDE, якщо, наприклад, програмуєте свій JSP-код у редакторі браузера Adobe Experience Manager. :(
Тревор

Можливо, ми можемо використати це для перевірки поведінки вашої програми в прямому середовищі, надрукувавши vardump у форматі html.
омего

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. Я думаю, що це найкращий аналог var_dump () PHP


4
Цікаво ... чи знаєте ви, чому це не статичний метод?
мирелон

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

Імо, краще, якщо ви абстрагували його на користувацький клас корисності, а не використовуєте його безпосередньо, це дає вам гнучкість в управлінні сторонніми залежностями
МАЙОБІО ХАССАН

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.