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?

Jon Cram
fonte
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 .

serg10
fonte
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.

Chase Seibert
fonte
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));
}
Harry Lime
fonte
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

Ali Mamedov
fonte
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 uso Jestr com resultados razoáveis.

brmiller
fonte
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.

mattalxndr
fonte
0

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

Daniel
fonte
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.

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

}
Stephane
fonte