Was ist das Java-Äquivalent von PHP var_dump?


127

PHP verfügt über eine var_dump () - Funktion, die den internen Inhalt eines Objekts ausgibt und den Typ und Inhalt eines Objekts anzeigt .

Beispielsweise:

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

wird ausgegeben:

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

Was ist das Äquivalent in Java, das dasselbe tut?


1
hast du db4o ausprobiert? es ist nicht speziell dafür, aber ich denke, es wird perfekt funktionieren;
Wassermann Power

Antworten:


67

Es ist in Java nicht ganz so integriert, daher erhalten Sie es nicht kostenlos. Es wird eher mit Konventionen als mit Sprachkonstrukten gemacht. In allen Datenübertragungsklassen (und möglicherweise sogar in allen Klassen, die Sie schreiben ... ) sollten Sie eine sinnvolle toStringMethode implementieren . Hier müssen Sie also toString()Ihre PersonKlasse überschreiben und den gewünschten Status zurückgeben.

Es gibt Dienstprogramme , die beim Schreiben einer guten toString-Methode helfen, oder die meisten IDEs verfügen über eine automatische toString()Schreibverknüpfung.



Siehe auch stackoverflow.com/questions/9444573/… zur Guava-Alternative und zur Intellij IDEA-Vorlage.
Vadzim

31

Nach meiner Erfahrung wird var_dump normalerweise zum Debuggen von PHP anstelle eines schrittweisen Debuggers verwendet. In Java können Sie natürlich den Debugger Ihrer IDE verwenden, um eine visuelle Darstellung des Inhalts eines Objekts anzuzeigen.


10
Ja, die meisten PHP- oder Webentwickler vergessen das Debuggen. Weil sie es vorziehen, das Debug-Ergebnis im Browser zu sehen.
GusDeCooL

10
Sie können den Debugger Ihrer IDE nicht verwenden, wenn Sie beispielsweise Ihren JSP-Code im browserbasierten Editor von Adobe Experience Manager programmieren. :(
Trevor

Vielleicht können wir es verwenden, um das Verhalten Ihres Programms in einer Live-Umgebung zu testen, indem wir den Vardump im HTML-Format drucken.
Omjego

18

Sie können die toString()Methode Ihres Objekts überschreiben, um den Inhalt auf eine von Ihnen gewünschte Weise auszugeben, oder das Objekt mithilfe von Reflektion untersuchen (ähnlich wie bei Debuggern).

Der Vorteil der Verwendung von Reflection besteht darin, dass Sie Ihre einzelnen Objekte nicht so ändern müssen, dass sie "analysierbar" sind. Dies erhöht jedoch die Komplexität. Wenn Sie Unterstützung für verschachtelte Objekte benötigen, müssen Sie diese schreiben.

Dieser Code listet die Felder und ihre Werte für ein Object"o" auf.

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

Was ist das Feld, das Sie verwenden und von wo importiert?
RMiranda

3
java.lang.reflect.Field
Harry Lime

17

Ich denke, dass der beste Weg, dies zu tun, die Verwendung von Google-Gson ist (eine Java-Bibliothek zum Konvertieren von JSON in Java-Objekte und umgekehrt).

Laden Sie es herunter und fügen Sie Ihrem Projekt die Datei "jar" hinzu

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

Ausgabe:

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

Sie können jedes Objekt (Arrays, Listen usw.) in JSON konvertieren. Ich denke, dass es das beste Analogon von PHPs var_dump () ist.


4
Interessant ... wissen Sie, warum es keine statische Methode ist?
Mirelon

2
Sie können es wie eine statische Methode verwenden: new Gson (). ToJson (...), ohne neue Variablen zu erstellen.
Ali Mamedov

Imo, es ist besser, wenn Sie es in eine benutzerdefinierte Dienstprogrammklasse abstrahieren, als es direkt zu verwenden. Dies gibt Ihnen Flexibilität beim Verwalten von Abhängigkeiten von
Drittanbietern



4

Ich benutze GSON gerne, weil es oft schon von der Art der Projekte abhängt, an denen ich arbeite:

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

Oder ersetzen Sie jede andere von Ihnen verwendete JSON-Bibliothek durch GSON.



0

Sie XML-Serialisierung, und Sie sollten eine sehr übersichtliche Darstellung auch tief verschachtelter Objekte erhalten.


0

Ich denke, etwas Ähnliches könnten Sie tun, um eine einfache Methode zu erstellen, die das Objekt druckt, das Sie sehen möchten. Etwas wie das:

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

Es ist nicht dasselbe wie var_dump (), aber Sie können sich einen allgemeinen Überblick darüber verschaffen, ohne zu Ihrer Debugger-IDE wechseln zu müssen.


0

Nur um die Field-Lösung (setAccessible) zu addieren, damit Sie auf die private Variable eines Objekts zugreifen können:

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

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.