Reflection em Java

19 de ago de 2012 - Paulo Dias


Reflection é a capacidade que um programa tem de investigar e avaliar seus objetos em tempo de execução. Em Java é possível utilizar reflection através da classe Class. Existem algumas formas para se obter um objeto da classe Class.

Por exemplo:

 

        // utilizando o método getClass()
        String teste = new String("teste");
        Class c1 = teste.getClass();
        
        // utilizando o sufixo class        
        Class c2 = String.class;
       
        // utilizando o método estático de Class
        Class c3 = Class.forName("java.lang.String");

Os métodos da classe Class fornecem informações como:

A classe do objeto.
Os construtores do objeto.
Os métodos do objeto.
Os atributos do objeto.

Essas informações são retornadas através de objetos de classes relacionadas a Reflection. Essas classes encontram-se no pacote java.lang.reflect. Entre outras temos:

java.lang.reflect.Constructor:
Representa os construtores da classe

java.lang.reflect.Method:
Representa os métodos da classe

java.lang.reflect.Field
Representa os atributos da classe

Para demonstrar o uso dos métodos da classe Class segue alguns exemplos:
1 - Investigar os nomes dos atributos:

 

import java.lang.reflect.Field;

public class Pessoa {

    public String nome;
    private int idade;

    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

    public int getIdade() {
        return idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }
    
    public static void main(String[] args) {
    
        Pessoa p1 = new Pessoa( "João", 25 );
        
        Class classe = p1.getClass(); 
        
        System.out.println("A classe " + classe.getSimpleName() + " possui os atributos:" );
        
        for ( Field atributo : classe.getDeclaredFields() ) {
            
            System.out.println( atributo.getName() );
        }
    }
}
     

2 - Executar um método:
 

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Pessoa {

    public String nome;
    private int idade;

    // não esqueça de preencher esses métodos
    public Pessoa(String nome, int idade) {...} 
    
    public int getIdade() {...}
    
    public void setIdade(int idade) {...}
    
    public void digaOi() {
        
        System.out.println("Oi");
    }
    
    public static void main(String[] args) throws Exception {
    
        Pessoa p1 = new Pessoa( "João", 25 );
        
        Class classe = p1.getClass(); 
        
        Method metodo = classe.getMethod( "digaOi" );
        
        metodo.invoke(p1);
        
    }
}

3 - Executar metodo estático:
 

import java.lang.reflect.Method;

public class Carro {

    private int id;
    private String modelo;
    
    public static int nextId;

    public Carro(String modelo) {
        
        this.modelo = modelo;
        this.id = Carro.getNextId();
    }
    
    // não esqueça de preencher esses métodos
    public int getId() {...}

    public void setId(int id) {...}

    public String getModelo() {...}

    public void setModelo(String modelo) {...}

    public static int getNextId() {
        
        Carro.nextId += 1;
        return Carro.nextId;
    }
    
    public static void main(String[] args) throws Exception {
    
        Carro c1 = new Carro( "uno" ); // id = 1
        
        Class classe = c1.getClass(); 
        
        Method metodo = classe.getDeclaredMethod( "getNextId" );
        
        System.out.println( metodo.invoke( null ) ); // retorna 2        
    }
}

4 - Instanciar objeto:
 

import java.lang.reflect.Constructor;

public class Veiculo {

    public void andar() {
        
        System.out.println("andar");
    }
    
    public void parar() {
        
        System.out.println("parar");
    }
    
    public static void main(String[] args) throws Exception {
    
        Veiculo v1 = new Veiculo();
        
        Class classe = v1.getClass(); 
        
        Constructor construtor = classe.getConstructor();
        
        System.out.println(  construtor.newInstance() ); 
        System.out.println( v1 );
    }
}

Mais sobre reflection
http://www-pet.inf.ufsm.br
http://valdemarjr.blogspot.com.br
http://blog.caelum.com.br


Paulo Dias

Graduado no curso tecnólogo em análise e desenvolvimento de sistemas. Defensor do Software Livre e da democratização da informação. Possui as certificações Linux LPIC-1 e Java OCA. Atualmente exerce a função de coordenador técnico na área de telecomunicações.

Siga-me no Twitter