Recentemente tive uma atividade para percorrer os atributos de um POJO que eu desconhecia, retornando os seus atributos e valores.
Para simplificar a demonstração foi ocultado os imports, package, métodos gets/sets e o construtor da classe. Vejamos o exemplo:
public class Cliente { private int id; private String nome; private Date dtNascimento; private Endereco endereco; private int telefone; }
Reparem que a classe Cliente possui um atributo do tipo endereco.
public class Endereco { private int id; private String rua; private int numero; private String bairro; }
A terceira classe criada com o método main, instância o objeto cliente e faz a chamada para o método imprimeAtributoseValoresPojo passando como parâmetro a instância da classe cliente.
public class Teste { public static void main(String[] args) { Endereco endereco = new Endereco(1, "Avenida Brasil", 147, "Centro"); Cliente cliente = new Cliente(1, "José da Silva", new Date(), endereco, 32557744); Utilitarios utilitarios = new Utilitarios(); utilitarios.imprimeAtributoseValoresPojo(cliente); } }
Após receber a instância da classe cliente é adicionado todos os campos em um array do tipo Field. E com um foreach é acessado o nome e o valor do atributo.
public class Utilitarios { public void imprimeAtributoseValoresPojo(Object object){ Class<?> classe = object.getClass(); Field[] campos = classe.getDeclaredFields(); String nomeAtributo = ""; Object valorAtributo = null; for (Field campo : campos) { try { nomeAtributo = campo.getName(); campo.setAccessible(true); //Necessário por conta do encapsulamento das variáveis (private) valorAtributo = campo.get(object); } catch (Exception e) { e.printStackTrace(); } System.out.println(nomeAtributo + ": " + valorAtributo); } }
Vejamos a saída no console:
id: 1 nome: José da Silva dtNascimento: Thu Aug 25 21:05:17 BRT 2016 endereco: br.com.getAttributesPojo.model.Endereco@5c647e05 telefone: 32557744
Beleza fera!!! E onde estão os dados do objeto endereço? Por se tratar de um objeto complexo é retornado o endereço em memória. Nesse caso precisamos identificar o tipo do atributo, e a partir disto realizar o mesmo procedimento anterior. Vejamos:
public class Utilitarios { public void imprimeAtributoseValoresPojo(Object object){ Class<?> classe = object.getClass(); Field[] campos = classe.getDeclaredFields(); String nomeAtributo = ""; Object valorAtributo = null; Object tipoAtributo = null; for (Field campo : campos) { try { nomeAtributo = campo.getName(); campo.setAccessible(true); //Necessário por conta do encapsulamento (private) valorAtributo = campo.get(object); tipoAtributo = campo.getType(); //Obtendo o tipo do atributo } catch (Exception e) { e.printStackTrace(); } System.out.println(nomeAtributo + ": " + valorAtributo); //Código adicionado if (tipoAtributo.toString().contains("br.com.getAttributesPojo")){ Class<?> classeFilha = (Class<?>) tipoAtributo; Field[] camposFilha = classeFilha.getDeclaredFields(); String nomeAtributoFilha = ""; Object valorAtributoFilha = null; for (Field campoFilha : camposFilha) { try { nomeAtributoFilha = campoFilha.getName(); campoFilha.setAccessible(true); valorAtributoFilha = campoFilha.get(valorAtributo); //Nesse momento é passado o valor do objeto endereço } catch (Exception e) { e.printStackTrace(); } System.out.println("(Filha) " + nomeAtributoFilha + ": " + valorAtributoFilha); } } } } }
Executando novamente o retorno é esse:
id: 1 nome: José da Silva dtNascimento: Thu Aug 25 21:45:22 BRT 2016 endereco: br.com.getAttributesPojo.model.Endereco@5c647e05 (Filha) id: 1 (Filha) rua: Avenida Brasil (Filha) numero: 147 (Filha) bairro: Centro telefone: 32557744
A API de reflection em Java é poderosa e nos permite analisar e manipular várias informações de uma classe (atributos, métodos, construtores e etc). Tive um pouco de dificuldade para obter as informações do objeto endereço e por isso decidi escrever. Caso queiram conhecer a API um pouco melhor, sugiro a leitura desse post ou acessem a documentação.
Abraço 😀
Muito Bom!!!!!
Obrigado amigo!!
Cara valeu, você ajudou demais! Abraços e sucesso ai pra você!
Disponha meu caro. Tmj!