Skip to content
Published May 26, 2014
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

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: