¿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?


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 .



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.


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

¿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


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



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.



0

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


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.


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

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.