Share Button

Paulo Vinícius

Versão 0.1

Histórico de Revisão
Revisão 0.1 26/05/2014 Paulo Vinícius
Criado

Reflection é um recurso poderoso que permite obter informações da classe em tempo de execução, este processo também chamado de introspecção, ou seja, a capacidade de um objeto fornecer informações sobre si mesmo permitindo saber quais são seus métodos, propriedades, construtores e executar métodos de classes que foram carregadas em runtime.

Você já se perguntou como as IDEs, como o Netbeans conseguem enxergar toda a estrutura de uma classe? A resposta é através de reflection. Não só as IDEs usam reflection diversos frameworks se beneficiam deste recurso poderoso. Para exemplificar o uso deste recurso segue abaixo alguns exemplos.

Examinando as classes

O pacote java.lang.reflect contém classes para reflexão, classes especificas para trabalhar com métodos, atributos e construtores. Através da classe Class também é possível retornar informações sobre seus modificadores (private, protected, public, abstract, final) entre outras informações. Existem diversas maneiras de se obter um objeto Class, dentre eles podemos destacar:

  • Executando o método getClass() do objeto:
Class clazz = null;
Teste teste = new Teste();
clazz = teste.getClass();
  • Através do sufixo da classe usando o .class
Class clazz = Teste.class;
  • Usando o método estático forName da classe Class.
Class clazz = Class.forName("java.lang.String");

Como exemplo, suponha a classe String, uma classe nativa do Java, para capturar o seu nome e o nome da sua superclasse o seguinte código mostrado no exemplo abaixo poderia ser executado.

public class ExemploReflection {

public static void main(String[] args) {

//Obtendo o objeto Class
Class clazz = String.class;

//Obtendo o nome da classe, incluindo o pacote que pertence
String nome = clazz.getName();

//Obtendo a Super Classe
Class superClasse = clazz.getSuperclass();

System.out.println("Nome da classe: " + nome);
System.out.println("Super classe: " + superClasse);

}

}

Listagem 1: Capturando o nome e a super classe

No código da listagem 1, o programa obtém um objeto Class da classe String. Logo em seguida o objeto Class é consultado para capturar o nome da classe e depois recupera o objeto Class da superclasse. Contanto que a classe não seja um Object ou uma interface, o método getSuperClass ira retorna a superclasse da classe.

Resultado do exemplo:

Nome da classe: java.lang.String
Super classe: java.lang.Object

Examinando atributos, métodos e construtores da classe

A classe Class contém vários métodos para poder examinar os componentes da classe, tais como, atributos, métodos, construtores e tipos aninhados. Veja a tabela 1 com alguns métodos usados para retornar essas informações.

Descrição Método
Retorna um array com os construtores da classe atual. public Constructor[] getConstructors()
Retorna um array com os atributos públicos da classe. public Field[] getFields()
Retorna um array com os métodos públicos da classe. public Method[] getMethods()
Retorna um array somente com os construtores declarados na classe. public Constructor[] getDeclaredConstructors()
Retorna um array somente com os atributos declarados na classe. public Field[] getDeclaredFields()
Retorna um array somente com os métodos declarados na classe. public Method[] getDeclaredMethods()
Retorna um atributo public da classe especificado no parâmetro. public Field getFields(String name)
Retorna um atributo declarado na classe especificado no parâmetro. public Field getDeclaredFields(String name)

Tabela 1

 Para exemplificar o uso dos métodos listados na tabela 1, iremos desenvolver um exemplo simples para acessar os atributos de uma classe. Observe a listagem 2 e 3: A listagem 2 é uma classe Java comum, chamada Pessoa, com atributos e métodos getters e setters, já a listagem 3 examina os atributos da classe Pessoa utilizando reflection.

public class Pessoa {

private String nome;
private String endereco;
private String telefone;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getEndereco() {
return endereco;
}

public void setEndereco(String endereco) {
this.endereco = endereco;
}

public String getTelefone() {
return telefone;
}

public void setTelefone(String telefone) {
this.telefone = telefone;
}

}

Listagem 2: Classe Pessoa

import java.lang.reflect.Field;

public class ExemploReflection2 {

public static void main(String[] args) {

Class clazz = Pessoa.class;

for (Field field : clazz.getDeclaredFields())
{

String campo = field.getName();
Class tipo = field.getType();
String nomeTipo = field.getName();

System.out.println("Campo: " + campo + " ,  Tipo: " + nomeTipo);

}

}

}

Listagem 3: Recuperando informações da classe Pessoa

Primeiramente é recuperado o objeto Class da classe Pessoa, logo em seguida é feito uma varredura em toda classe para retornar as informações de seus atributos declarados, através do método getDeclaredFields, retornamos nome do campo com o método getName e o tipo com o método getType. A classe Field contém métodos responsáveis por retornar informações dos atributos da classe, como o tipo do atributo e modificadores. Na tabela 2 são descritos alguns métodos da classe Field.

Resultado do exemplo:

Nome: nome, Tipo: java.lang.String
Nome: endereco, Tipo: java.lang.String
Nome: pessoa, Tipo: reflectionteste.Pessoa

 

Descrição Método
Retorna o nome do atributo. public String getName()
Retorna um objeto Class para o tipo do atributo. public Class<?> getType()
Retorna o valor do atributo. public Object get(Object obj)
Atribui uma valor a propriedade. public void set(Object obj, Object value)

Tabela 2

 Também podemos recuperar os métodos declarados na classe.

import java.lang.reflect.Method;

public class ExemploReflection3 {

public static void main(String[] args) {

Class clazz = Pessoa.class;

for (Method method : clazz.getDeclaredMethods())
{

String nome = method.getName();
Class tipoRetorno = method.getReturnType();

System.out.println("Método : " + nome + "  Tipo de retorno: " + tipoRetorno);

//Recuperandos os parâmetros do método
Class parametros[] = method.getParameterTypes();
System.out.println("Parâmetros: ");
for (Class c : parametros)
System.out.println("\t" + c.getName());

System.out.println("");

}

}

}

Listagem 4: Recuperando métodos da classe Pessoa

Ao recuperar os métodos declarados na classe Pessoa executamos o mesmo procedimento para recupar o objeto Class, logo em seguida é utilizado o método getDeclaredMethods() para recuperar os métodos, que retorna uma array contendo objetos do tipo Method. Os métodos getName e getReturnType retornam o nome do método e o seu tipo de retorno. O método getParameterTypes é utilizado para retornar os tipos dos parâmetros declarados nos métodos. A tabela 2 lista alguns método da classe Method.

Resultado do exemplo:

Método : getNome Tipo de retorno: class java.lang.String
Parâmetros:

Método : setNome Tipo de retorno: void
Parâmetros:
java.lang.String
Método : getEndereco Tipo de retorno: class java.lang.String
Parâmetros:

Método : setEndereco Tipo de retorno: void
Parâmetros:
java.lang.String
Método : getTelefone Tipo de retorno: class java.lang.String
Parâmetros:

Método : setTelefone Tipo de retorno: void
Parâmetros:
java.lang.String

Descrição Método
Retorna o nome do método. public String getName()
Retorna o tipo de retorno do método public Class<?> getReturnType()
Retorna o valor do atributo. public Class<?>[] getParameterTypes()

Tabela 3

Comments

comments

Leave a Comment