Qual é o equivalente em Java do PHP var_dump?


127

O PHP possui um var_dump () função que gera o conteúdo interno de um objeto, mostrando o tipo e o conteúdo de um objeto.

Por exemplo:

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

irá produzir:

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

Qual é o equivalente em Java que fará o mesmo?


1
você já tentou db4o? não é especificamente para isso, mas acho que funcionará perfeitamente;
Poder de Aquário

Respostas:


67

Como o Java não é tão elaborado, você não recebe isso de graça. Isso é feito com convenções e não com construções de linguagem. Em todas as classes de transferência de dados (e talvez até em todas as classes que você escreve ... ), você deve implementar um toStringmétodo sensato . Então, aqui você precisa substituir toString()seuPerson classe e retornar o estado desejado.

Existem utilitários disponíveis que ajudam a escrever um bom método toString, ou a maioria dos IDEs possui um toString()atalho de gravação automático .



Consulte também stackoverflow.com/questions/9444573/… na alternativa Guava e no modelo Intellij IDEA.
Vadzim

31

Na minha experiência, var_dump é normalmente usado para depurar o PHP no lugar de um depurador passo a passo. Em Java, é claro que você pode usar o depurador do IDE para ver uma representação visual do conteúdo de um objeto.


10
Sim, a maioria dos desenvolvedores de PHP ou Web esquece a depuração. Porque eles preferem ver o resultado da depuração no navegador.
GusDeCooL

10
Você não pode usar o depurador do IDE se, por exemplo, estiver programando seu código JSP no editor baseado em navegador do Adobe Experience Manager. :(
Trevor

Talvez possamos usá-lo para testar o comportamento do seu programa em ambiente ativo, imprimindo o vardump no formato html.
Omjego

18

Suas alternativas são substituir o toString() método do seu objeto para produzir o conteúdo da maneira que você gosta, ou usar a reflexão para inspecionar o objeto (de maneira semelhante ao que os depuradores fazem).

A vantagem de usar a reflexão é que você não precisará modificar seus objetos individuais para ser "analisável", mas há complexidade adicional e, se você precisar de suporte a objetos aninhados, precisará escrever isso.

Este código listará os campos e seus valores para um 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));
}

que campo é esse que você está usando, importado de onde?
RMiranda

3
java.lang.reflect.Field
Harry Lime

17

Eu acho que a melhor maneira de fazer isso é usando o google-gson (uma biblioteca Java para converter objetos JSON em Java e vice-versa)

Faça o download , adicione o arquivo "jar" ao seu projeto

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

Resultado:

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

Você pode converter qualquer objeto (matrizes, listas e etc) para JSON. Eu acho que é o melhor analógico do var_dump () do PHP


4
Interessante ... você sabe por que não é um método estático?
mirelon

2
Você pode usá-lo como um método estático: new Gson (). ToJson (...) sem criar novas variáveis.
Ali Mamedov

Imo, é melhor se você o abstraiu em uma classe de utilitário personalizado, em vez de usá-lo diretamente, isso lhe dá flexibilidade para gerenciar dependências de terceiros
MAYOBYO HASSAN



4

Eu gosto de usar o GSON porque muitas vezes já é uma dependência do tipo de projeto em que estou trabalhando:

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

Ou substitua o GSON por qualquer outra biblioteca JSON usada.



0

Você serializa XML e deve obter uma representação muito elegante, mesmo de objetos profundamente aninhados.


0

Eu acho que algo semelhante que você poderia fazer é criar um método simples que imprima o objeto que você deseja ver. Algo assim:

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

Não é o mesmo que var_dump (), mas você pode ter uma idéia geral, sem a necessidade de acessar o IDE do depurador.


0

Apenas para adicionar a solução Field (o setAccessible) para que você possa acessar a variável privada de um 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));
    } 

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.