Quel est l'équivalent Java de PHP var_dump?

127

PHP a une fonction var_dump () qui produit le contenu interne d'un objet, montrant le type et le contenu d'un objet.

Par exemple:

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

affichera:

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

Quel est l'équivalent en Java qui fera de même?

Jon Cram
la source
1
avez-vous essayé db4o? ce n'est pas spécifiquement pour cela, mais je pense que cela fonctionnera parfaitement;
Aquarius Power

Réponses:

67

Ce n'est pas tout à fait aussi intégré en Java, donc vous ne l'obtenez pas gratuitement. Cela se fait avec des conventions plutôt qu'avec des constructions de langage. Dans toutes les classes de transfert de données (et peut-être même dans toutes les classes que vous écrivez ... ), vous devez implémenter une toStringméthode sensible . Donc, ici, vous devez remplacer toString()dans votre Personclasse et retourner l'état souhaité.

Il existe des utilitaires disponibles qui aident à écrire une bonne méthode toString, ou la plupart des IDE ont un toString()raccourci d'écriture automatique .

serg10
la source
Voir aussi stackoverflow.com/questions/9444573/… sur l'alternative Guava et le modèle Intellij IDEA.
Vadzim le
31

D'après mon expérience, var_dump est généralement utilisé pour déboguer PHP à la place d'un débogueur pas à pas. En Java, vous pouvez bien sûr utiliser le débogueur de votre IDE pour voir une représentation visuelle du contenu d'un objet.

Chase Seibert
la source
10
Oui, la plupart des développeurs PHP ou Web oublient le débogage. Parce qu'ils préfèrent voir le résultat du débogage dans le navigateur.
GusDeCooL
10
Vous ne pouvez pas utiliser le débogueur de votre IDE si, par exemple, vous programmez votre code JSP dans l'éditeur basé sur le navigateur d'Adobe Experience Manager. :(
Trevor
Peut-être pouvons-nous l'utiliser pour tester le comportement de votre programme dans un environnement live en imprimant le vardump au format html.
omjego
18

Vos alternatives sont de remplacer la toString()méthode de votre objet pour afficher son contenu d'une manière que vous aimez, ou d'utiliser la réflexion pour inspecter l'objet (d'une manière similaire à ce que font les débogueurs).

L'avantage d'utiliser la réflexion est que vous n'aurez pas besoin de modifier vos objets individuels pour qu'ils soient "analysables", mais il y a une complexité supplémentaire et si vous avez besoin de la prise en charge d'objets imbriqués, vous devrez l'écrire.

Ce code listera les champs et leurs valeurs pour un 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
la source
quel est ce champ que vous utilisez, importé d'où?
RMiranda
3
java.lang.reflect.Field
Harry Lime
17

Je pense que la meilleure façon de le faire est d'utiliser google-gson (une bibliothèque Java pour convertir JSON en objets Java et vice-versa)

Téléchargez-le , ajoutez le fichier "jar" à votre projet

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

Production:

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

Vous pouvez convertir n'importe quel objet (tableaux, listes, etc.) en JSON. Je pense que c'est le meilleur analogue de var_dump () de PHP

Ali Mamedov
la source
4
Intéressant ... savez-vous pourquoi ce n'est pas une méthode statique?
mirelon
2
Vous pouvez l'utiliser comme une méthode statique: new Gson (). ToJson (...) sans créer de nouvelles variables.
Ali Mamedov le
Imo, c'est mieux si vous l'avez résumé dans une classe d'utilitaire personnalisée plutôt que de l'utiliser directement, cela vous donne la flexibilité de gérer les dépendances tierces
MAYOBYO HASSAN
7

Le package lang apache commons fournit une telle classe qui peut être utilisée pour construire une méthode toString () par défaut en utilisant la réflexion pour obtenir les valeurs des champs. Jetez un œil à ceci .

vraiment insensé
la source
Ces deux liens sont morts
beiller
4

J'utilise Jestr avec des résultats raisonnables.

brmiller
la source
4

J'aime utiliser GSON car c'est souvent déjà une dépendance du type de projets sur lesquels je travaille:

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

Ou remplacez GSON par toute autre bibliothèque JSON que vous utilisez.

mattalxndr
la source
0

Vous sérialisation XML, et vous devriez obtenir une représentation très soignée même des objets profondément imbriqués.

Daniel
la source
0

Je pense que quelque chose de similaire que vous pourriez faire est de créer une méthode simple qui imprime l'objet que vous voulez voir. Quelque chose comme ça:

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

Ce n'est pas la même chose que var_dump (), mais vous pouvez en avoir une idée générale, sans avoir besoin d'aller dans votre IDE de débogage.

Necare
la source
0

Juste pour ajouter sur la solution Field (le setAccessible) afin que vous puissiez accéder à la variable privée d'un objet:

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

}
Stéphane
la source