sábado, 26 de fevereiro de 2011

Um passo adiante do “Hello World” com Reflection em Java

Primeiro exemplo usando Reflection, agora sim sei do que se trata! Pois é, o conceito do uso de reflexão computacional é bem amplo e não o discutirei aqui, rápido e rasteiro veremos o primeiro passo de utilização de Reflection em Java.
Com o uso da Reflection API em Java temos um grande ganho de recursos que nos permitirão um pouco mais a frente discutir sobre granularidade, modularização e reutilização por exemplo. Por hora, fiquemos um passo a frente do “Hello World!” que já será o bastante para que a curiosidade sobre esta funcionalidade seja morta.
Abaixo um exemplo de invocações dinâmicas utilizando a Reflection API e suas derivadas.

package fakeprojectforsimplesamples;

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

/**
 * @author Fabio J. Walter
 */
public class SoftReflection {

    private String campoString1;
    private String campoString2;
    private int campoInt1;
    private boolean campoBoolean1;

    public static void main(String[] args) {

        //Tradicional
        SoftReflection softReflection = new SoftReflection();
        softReflection.reflectionSample();
       
        //Com Reflection
        try {
            SoftReflection _softReflection = SoftReflection.class.newInstance();
            _softReflection.reflectionSample();
        } catch (InstantiationException ex) {
            System.out.println("Problema na instanciacao!" + ex);
        } catch (IllegalAccessException ex) {
            System.out.println("Acesso ilegal!" + ex);
        }

    }

    public void reflectionSample() {
        System.out.println("Estamos executando a classe " + this.getClass().getSimpleName() + " !");

        System.out.print("Porque quero mostrar os campos dela aqui: ");

        Class<?> clazz = this.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            System.out.print(field.getName() + " ");
        }

        System.out.print("\nE os metodos aqui: ");
        for (Method metodo : clazz.getDeclaredMethods()) {
            System.out.print(metodo.getName() + " ");
        }
        System.out.println("");
        try {
            Method method = clazz.getMethod("calledByReflection", java.lang.String.class);
            method.setAccessible(true);
            method.invoke(this, "Minha mensagem de teste...");
        } catch (NoSuchMethodException ex) {
            System.out.println("Metodo nao existe!" + ex);
        } catch (SecurityException ex) {
            System.out.println("Metodo inacessivel!" + ex);
        } catch (IllegalAccessException ex) {
            System.out.println("Acesso ilegal ao metodo!" + ex);
        } catch (IllegalArgumentException ex) {
            System.out.println("Argumento ilegal!" + ex);
        } catch (InvocationTargetException ex) {
            System.out.println("Erro na chamada!" + ex);
        }

    }

    public void calledByReflection(String message) {
        System.out.println("\n\nCHAMADO POR REFLECTION! Message = " + message + "!\n\n\n");
    }
}


                Neste exemplo temos a implementação de chamadas a classes com construtores padrões, a chamadas de introspecção em classes onde obtivemos os campos declarados na classe e seus métodos, e a chamada a estes métodos utilizando o recurso de reflexão inclusive com a passagem de parâmetros.
         Dentro em breve postarei outro pequeno exemplo prático de reflexão com Java, onde teremos uma aplicação prática deste recurso tão poderoso da Java API, em situações corriqueiras e que nem sempre ou nunca imaginamos que possamos aplicar um recurso avançado em uma tarefa simples.

Nenhum comentário:

Postar um comentário