¿Cuál es el equivalente Java de PHP var_dump?

127

PHP tiene una función var_dump () que genera el contenido interno de un objeto, mostrando el tipo y contenido de un objeto.

Por ejemplo:

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

dará salida:

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

¿Cuál es el equivalente en Java que hará lo mismo?

Jon Cram
fuente
1
¿Has probado db4o? no es específicamente para esto, pero creo que funcionará perfectamente;
Acuario Power

Respuestas:

67

No está tan integrado en Java, por lo que no obtienes esto de forma gratuita. Se hace con convenciones en lugar de construcciones de lenguaje. En todas las clases de transferencia de datos (y tal vez incluso en todas las clases que escriba ... ), debe implementar un toStringmétodo razonable . Entonces, aquí debe anular toString()en su Personclase y devolver el estado deseado.

Hay utilidades disponibles que ayudan a escribir un buen método toString, o la mayoría de los IDE tienen un toString()acceso directo de escritura automática .

serg10
fuente
Consulte también stackoverflow.com/questions/9444573/… sobre la alternativa de Guava y la plantilla Intellij IDEA.
Vadzim
31

En mi experiencia, var_dump se usa típicamente para depurar PHP en lugar de un depurador paso a paso. En Java, por supuesto, puede usar el depurador de su IDE para ver una representación visual del contenido de un objeto.

Chase Seibert
fuente
10
Sí, la mayoría de los desarrolladores de PHP o web se olvidan de la depuración. Porque prefieren ver el resultado de depuración en el navegador.
GusDeCooL
10
No puede usar el depurador de su IDE si, por ejemplo, está programando su código JSP en el editor basado en navegador de Adobe Experience Manager. :(
Trevor
Tal vez podamos usarlo para probar el comportamiento de su programa en un entorno en vivo imprimiendo vardump en formato html.
omjego
18

Sus alternativas son anular el toString()método de su objeto para generar su contenido de la manera que desee, o usar la reflexión para inspeccionar el objeto (de manera similar a lo que hacen los depuradores).

La ventaja de usar la reflexión es que no necesitará modificar sus objetos individuales para que sean "analizables", pero hay una complejidad adicional y si necesita soporte de objetos anidados, tendrá que escribir eso.

Este código enumerará los campos y sus valores para 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));
}
Harry lima
fuente
¿Cuál es ese campo que estás utilizando, importado de dónde?
RMiranda
3
java.lang.reflect.Field
Harry Lime
17

Creo que la mejor manera de hacerlo es usar google-gson (una biblioteca de Java para convertir JSON en objetos de Java y viceversa)

Descárguelo , agregue el archivo "jar" a su proyecto

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

Salida:

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

Puede convertir cualquier objeto (matrices, listas, etc.) a JSON. Creo que es el mejor análogo de var_dump () de PHP

Ali Mamedov
fuente
44
Interesante ... ¿sabes por qué no es un método estático?
mirelon
2
Puede usarlo como un método estático: new Gson (). ToJson (...) sin crear nuevas variables.
Ali Mamedov
Imo, es mejor si lo resumió en una clase de utilidad personalizada en lugar de usarlo directamente, esto le brinda flexibilidad para administrar dependencias de terceros
MAYOBYO HASSAN
7

El paquete lang de apache commons proporciona una clase de este tipo que se puede utilizar para construir un método toString () predeterminado mediante la reflexión para obtener los valores de los campos. Solo mira esto .

realmente loco
fuente
Ambos enlaces están muertos
Beiller
4

Yo uso Jestr con resultados razonables.

brmiller
fuente
4

Me gusta usar GSON porque a menudo ya depende del tipo de proyectos en los que estoy trabajando:

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

O sustituya GSON por cualquier otra biblioteca JSON que use.

mattalxndr
fuente
0

Usted serializa XML, y debe obtener una representación muy clara incluso de objetos profundamente anidados.

Daniel
fuente
0

Creo que algo similar que podría hacer es crear un método simple que imprima el objeto que desea ver. Algo como esto:

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

No es lo mismo que var_dump (), pero puede tener una idea general de ello, sin la necesidad de ir a su IDE de depurador.

Necare
fuente
0

Solo para agregar la solución Field (setAccessible) para que pueda acceder a la variable privada de un objeto:

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
fuente