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?

Jon Cram
źródło
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.

serg10
źródło
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.

Ścigaj Seiberta
źródło
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));
}
Harry Lime
źródł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

Ali Mamedov
źródło
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

Używam Jestra z rozsądnymi wynikami.

brmiller
źródło
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.

mattalxndr
źródło
0

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

Daniel
źródło
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.

Necare
źródło
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));
    } 

}
Stephane
źródło