Jaki jest odpowiednik PHP var_dump w Javie?


127

PHP ma funkcję var_dump (), która wyświetla wewnętrzną zawartość obiektu, pokazując typ i zawartość obiektu.

Na przykład:

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);

wyświetli:

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

Jaki jest odpowiednik w Javie, który zrobi to samo?


1
czy próbowałeś db4o? nie jest to specjalnie do tego celu, ale myślę, że będzie działać idealnie;
Aquarius Power

Odpowiedzi:


67

Nie jest tak dopracowany w Javie, więc nie dostajesz tego za darmo. Odbywa się to za pomocą konwencji, a nie konstrukcji językowych. We wszystkich klasach transferu danych (a może nawet we wszystkich klasach, które piszesz ... ) powinieneś zaimplementować rozsądnytoString metodę. Więc tutaj musisz nadpisać toString()w swojej Personklasie i przywrócić pożądany stan.

Dostępne są narzędzia, które pomagają w napisaniu dobrej metody toString lub większość IDE ma automatyczny toString()skrót do pisania.



Zobacz także stackoverflow.com/questions/9444573/… na temat alternatywy Guava i szablonu Intellij IDEA.
Vadzim

31

Z mojego doświadczenia wynika, że ​​var_dump jest zwykle używany do debugowania PHP zamiast debugera krokowego. W Javie możesz oczywiście użyć debuggera IDE, aby zobaczyć wizualną reprezentację zawartości obiektu.


10
Tak, większość programistów PHP i WWW zapomina o debugowaniu. Ponieważ wolą widzieć wynik debugowania w przeglądarce.
GusDeCooL

10
Nie możesz używać debugera IDE, jeśli na przykład programujesz kod JSP w edytorze przeglądarki Adobe Experience Manager. :(
Trevor,

Może możemy go użyć do przetestowania zachowania twojego programu w środowisku na żywo, drukując vardump w formacie html.
omjego

18

Twoje alternatywy to zastąpienie toString() metody obiektu w celu wyprowadzenia jego zawartości w sposób, który ci się podoba, lub użycie odbicia w celu sprawdzenia obiektu (w sposób podobny do tego, co robią debuggery).

Zaletą używania odbicia jest to, że nie będziesz musiał modyfikować swoich pojedynczych obiektów, aby były „analizowalne”, ale jest to dodatkowa złożoność i jeśli potrzebujesz obsługi obiektów zagnieżdżonych, będziesz musiał to napisać.

Ten kod wyświetli listę pól i ich wartości dla 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));
}

co to za pole, którego używasz, importowane skąd?
RMiranda,

3
java.lang.reflect.Field
Harry Lime,

17

Myślę, że najlepszym sposobem na to jest użycie google-gson (biblioteka Java do konwersji JSON na obiekty Java i odwrotnie)

Pobierz go, dodaj plik „jar” do swojego projektu

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));

Wynik:

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

Możesz przekonwertować dowolny obiekt (tablice, listy itp.) Na JSON. Myślę, że to najlepszy odpowiednik var_dump () w PHP


4
Ciekawe ... czy wiesz, dlaczego nie jest to metoda statyczna?
mirelon

2
Możesz używać It jak metody statycznej: new Gson (). ToJson (...) bez tworzenia nowych zmiennych.
Ali Mamedov

Imo, lepiej, jeśli
wyabstrahujesz



4

Lubię używać GSON, ponieważ często jest to już zależność od typu projektów, nad którymi pracuję:

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

Lub zamień GSON na inną używaną bibliotekę JSON.



0

Serializacja XML-a i powinieneś uzyskać bardzo zgrabną reprezentację nawet głęboko zagnieżdżonych obiektów.


0

Myślę, że coś podobnego możesz zrobić, to stworzyć prostą metodę, która drukuje obiekt, który chcesz zobaczyć. Coś takiego:

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

To nie to samo, co var_dump (), ale możesz uzyskać ogólne pojęcie o tym, bez konieczności przechodzenia do debugera IDE.


0

Wystarczy dodać rozwiązanie Field (setAccessible), aby uzyskać dostęp do prywatnej zmiennej obiektu:

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));
    } 

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.