Reflexão em Java

14 06 2008

Reflexão é o processo onde se consegue em tempo de execução informações (métodos, atributos e construtores) de uma classe.

Vou mostrar aqui duas classes, a primeira classe será usada para ser refletida e a segunda classe irá apresenta como usar o básico da reflexão.

Classe matemática

package reflexao;

public class matematica {
    public double pi(){
        return Math.PI;
    }

    public static String nomeClasse(){
        return "matemática";
    }

    public int soma(int a, int b){
        return a+b;
    }
}

Classe principal

package reflexao;

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

/**
 * @author Anselmo Battisti
 */
public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        String str = new String("Anselmo");
        Field atributos[] = null;
        Method metodos[] = null;

        Class c = str.getClass();

        atributos = c.getDeclaredFields();

        System.out.println("ATRIBUTOS:");
        for(int i=0; i < atributos.length; i++){
            System.out.println(atributos[i].toString());
        }

        metodos = c.getMethods();
        System.out.println("MÉTODOS:");
        for(int i=0; i < metodos.length; i++){
            System.out.println(metodos[i].toString());
        }

        // invocar um método de uma classe a partir da String do seu nome
        String stringNomeClasse = "reflexao.matematica";
        String stringNomeMetodo = "pi";
        String stringNomeMetodoNome = "nomeClasse";
        String stringNomeSoma = "soma";

        // carrega a classe
        Class classeGenerica = Class.forName(stringNomeClasse);

        // instancia um objeto
        Object obj = classeGenerica.newInstance();

        // retorna todos os métodos da classe passada
        Method metodoPI = classeGenerica.getMethod(stringNomeMetodo);
        Method metodoNome = classeGenerica.getMethod(stringNomeMetodoNome);

        // invoda o método do obj instanciado
        System.out.println(metodoPI.invoke(obj).toString());

        // caso o método seja estático
        System.out.println(metodoNome.invoke(stringNomeClasse));

        // chama um método com parâmetros
        Method soma = classeGenerica.getMethod(stringNomeSoma, int.class, int.class);
        System.out.println(soma.invoke(obj,5,10));
    }
}

Ações

Informações

Uma resposta

14 06 2008
Anderson

Estou realizando minha atividade diária de monitorar meu RSS quando me deparo com esta reflexão! Ao invés de ficar refletindo, preste atenção na aula!!! haha

T+

Deixe um comentário