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));
    }
}
Anúncios

Ações

Information

2 responses

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+

28 09 2011
Rafael

HEHE AI PROFESSOR FOI UTIL NO MEU TRABALHO REFLEXAO HOHO!!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: