Qual è l'equivalente Java di PHP var_dump?


127

PHP ha una funzione var_dump () che genera il contenuto interno di un oggetto, mostrando il tipo e il contenuto di un oggetto.

Per esempio:

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

produrrà:

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

Qual è l'equivalente in Java che farà lo stesso?


1
hai provato db4o? non è specifico per questo, ma penso che funzionerà perfettamente;
Aquarius Power il

Risposte:


67

Non è così integrato in Java, quindi non lo ottieni gratuitamente. È fatto con convenzioni piuttosto che con costrutti di linguaggio. In tutte le classi di trasferimento dei dati (e forse anche in tutte le classi che scrivi ... ), dovresti implementare un toStringmetodo ragionevole . Quindi qui devi scavalcare la toString()tua Personclasse e restituire lo stato desiderato.

Ci sono utility disponibili che aiutano a scrivere un buon metodo toString o la maggior parte degli IDE ha un toString()collegamento di scrittura automatica .



Vedi anche stackoverflow.com/questions/9444573/… sull'alternativa Guava e sul modello IDEA Intellij.
Vadzim,

31

Nella mia esperienza, var_dump è in genere utilizzato per il debug di PHP al posto di un debugger step-sebbene. In Java, puoi ovviamente usare il debugger del tuo IDE per vedere una rappresentazione visiva del contenuto di un oggetto.


10
Sì, la maggior parte degli sviluppatori PHP o Web dimenticano il debug. Perché preferiscono vedere il risultato del debug nel browser.
GusDeCooL

10
Non è possibile utilizzare il debugger del proprio IDE se, ad esempio, si sta programmando il codice JSP nell'editor basato su browser di Adobe Experience Manager. :(
Trevor,

Forse possiamo usarlo per testare il comportamento del tuo programma in ambiente live stampando il vardump in formato html.
omjego,

18

Le tue alternative sono di sovrascrivere il toString()metodo del tuo oggetto per produrre il suo contenuto in un modo che ti piace, o usare la riflessione per ispezionare l'oggetto (in modo simile a quello che fanno i debugger).

Il vantaggio di usare la riflessione è che non dovrai modificare i tuoi singoli oggetti in modo che siano "analizzabili", ma c'è una maggiore complessità e se hai bisogno del supporto di oggetti nidificati dovrai scriverlo.

Questo codice elencherà i campi e i loro valori per una 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));
}

cos'è quel campo che stai utilizzando, importato da dove?
RMiranda,

3
java.lang.reflect.Field
Harry Lime

17

Penso che il modo migliore per farlo sia usare google-gson (una libreria Java per convertire oggetti JSON in Java e viceversa)

Scaricalo , aggiungi il file "jar" al tuo progetto

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

Produzione:

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

È possibile convertire qualsiasi oggetto (array, elenchi e così via) in JSON. Penso che sia il miglior analogo del var_dump () di PHP


4
Interessante ... sai perché non è un metodo statico?
mirelon,

2
Puoi usarlo come un metodo statico: new Gson (). ToJson (...) senza creare nuove variabili.
Ali Mamedov,

Imo, è meglio se lo hai estratto in una classe di utilità personalizzata anziché utilizzarlo direttamente, questo ti dà la flessibilità di gestire le dipendenze di terze parti
MAYOBYO HASSAN



4

Mi piace usare GSON perché spesso dipende già dal tipo di progetti a cui sto lavorando:

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

Oppure sostituisci GSON con qualsiasi altra libreria JSON che usi.



0

La tua serializzazione XML e dovresti ottenere una rappresentazione molto accurata anche di oggetti profondamente annidati.


0

Penso che qualcosa di simile che potresti fare è creare un metodo semplice per stampare l'oggetto che vuoi vedere. Qualcosa come questo:

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

Non è lo stesso di var_dump (), ma puoi avere un'idea generale di esso, senza la necessità di andare al tuo IDE debugger.


0

Solo per aggiungere la soluzione Field (setAccessible) in modo da poter accedere alla variabile privata di un oggetto:

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.