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