Uso de Reflections(Reflexiones) en Java

La reflexión es comúnmente utilizada cuando se quiere examinar o modificar en tiempo de ejecución el comportamiento de las aplicaciones. Por ejemplo, sabiendo el nombre de una clase, podríamos saber que propiedades, constructores, o métodos tiene. Es como cuando uno obtiene la metadata de una tabla, pero en este caso es la metadata de una clase.
Se puede instanciar objetos, solo con saber el nombre de la clase, o ejecutar sus métodos en tiempo de ejecución.

¿Alguna vez no te has preguntado como Struts logra invocar un método en tu DispatchAction, tan solo con saber el nombre del método que tu envías en el request?. Pues la respuesta es: usando reflexiones. Lo podrás comprobar viendo el fuente de la clase DispacthAction.java de struts.

La reflexión es una técnica poderosa y puede permitir que las aplicaciones realicen operaciones que de otro modo sería imposible.

Aquí un pequeño ejemplo del uso de reflexiones:
1) Clase a manipular con reflexiones:


public class ClienteAction {
public String saludo(String nombre){
return "Hola " + nombre;
}
public String despedida(String nombre){
return "Nos vemos " + nombre;
}
}

2) Clase que aplica reflexiones sobre ClienteAction

import java.lang.reflect.Method;

public class Principal {
public static void main(String ... x) throws Exception{
ClienteAction clienteAction = new ClienteAction();
//1) Carga en memoria la clase ClienteAction.
// Pudo haber sido con clienteAction.getClass()
Class claseClienteAction = Class.forName("ClienteAction");
String nombreMetodoAEjecutar = "saludo";
String parametroAEnviar = "Warner Pencaks";
//2) Crea un método. El primer parametro indica el nombre del método.
// El segundo indica el tipo de parametro que va a aceptar (pueden haber mas).
Method metodoAEjecutar = claseClienteAction.getMethod(nombreMetodoAEjecutar, String.class);
//3) Se ejecuta el método sobre el objeto clienteAction, enviandole un parámetro.
Object respuesta = metodoAEjecutar.invoke(clienteAction, parametroAEnviar);
//4) Se muestra lo que resulta de ejecutar el método.
System.out.println( metodoAEjecutar.getName() + " : " + String.valueOf(respuesta));
}
}

Links de algunos tutoriales, donde se explica mas a detalle el uso de otras clases que componen el paquete java.lang.reflect.*, como Field, Constructor, etc:
http://java.sun.com/docs/books/tutorial/reflect/index.html
http://www.javahispano.org/contenidos/es/introduccrion_al_api_reflection_reflexrion_de_ja/

3 comentarios:

JAVAMAN dijo...

Interesante este tema de Reflexion ya que es muy pero muy usado, internamente dentro de los actuales Frameworks JAVA. Buen aporte !. Ahí te dejo mis BLOG hay aportes importates:

TEMAS JAVA PURO % CERTIFICACIÓN:
http://frameworksjava2008.blogspot.com/

TEMAS NETAMENTE DE FRAMEWORKS:
http://viviendoconjavaynomoririntentandolo.blogspot.com/


Saludos...

Mayer Horna dijo...

Gracias JAVAMAN por publicar tus links, los estoy revisando. Buena info xD

Anónimo dijo...

buena info.
http://blogdelinformatico.com.ar