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?

Jon Cram
quelle
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.

serg10
quelle
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.

Chase Seibert
quelle
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));
}
Harry Lime
quelle
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.

Ali Mamedov
quelle
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
7

Das Paket apache commons lang bietet eine solche Klasse, mit der eine Standardmethode toString () mithilfe von Reflection erstellt werden kann, um die Werte von Feldern abzurufen. Werfen Sie einen Blick auf diese .

wirklich verrückt
quelle
Beide Links sind tot
Beiller
4

Ich benutze Jestr mit vernünftigen Ergebnissen.

brmiller
quelle
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.

mattalxndr
quelle
0

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

Daniel
quelle
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.

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

}
Stephane
quelle