¿Por qué Sun eligió el nombre Reflection? Reflection, que en castellano significa reflejo, resume en una sola palabra lo que Java Reflection API realiza.
Dentro de la Máquina Virtual de Java están todos los datos de las clases que están cargadas en memoria. Java Reflection API lo que hace en realidad es permitir un acceso a estos datos. De este modo, utilizando código en Java, hacemos que la Máquina Virtual acceda a datos que ya están dentro de la máquina virtual. En cierto modo, Java Reflection hace que código en Java se refleje a sí mismo, pudiendo, de este modo, acceder a distintos tipos de datos.
A través de la Java Reflection API no estamos accediendo a datos contenidos en un fichero, en servidor de Internet o en ningún otro sitio, sino que en realidad estamos accediendo a los propios datos de la Máquina Virtual.
Java Reflection API resulta ideal si lo que queremos es realizar un debug de nuestro código en ejecución). De este modo, podemos tener en una ventana el programa en Java en ejecución, y en otra ventana una lista con todas las variables y sus respectivos valores, o una lista con todos los constructores y métodos de una clase determinada. Haciendo clic en uno de estos métodos, podremos hacer que la Máquina Virtual llame al método en cuestión y, en consecuencia, veremos el resultado en tiempo real.
Imaginemos que un amigo nuestro nos pasa por Internet un programa en Java que él ha hecho. Al recibir el e-mail nos damos cuenta de que nuestro amigo no solamente no nos ha pasado el archivo .java sino que además no nos ha enviado ningún tipo de documentación que nos explique cómo utilizar la clase que él ha creado. En conclusión, tenemos una clase en Java de la cual no tenemos documentación alguna y además no disponemos de los fuentes.
Ante tal situación, lo más lógico sería sencillamente no hacer uso de la clase y pedirle al amigo que nos envíe el fichero Java, pero también podemos hacer uso de la Java Reflection API para visualizar una lista de constructores, métodos y variables de esta clase. De esta manera, podremos ver lo que hay "dentro" de la clase y, con un poco de intuición, podremos determinar la mejor manera de hacer uso de esa clase.
![]() |
![]() |
Un ejemplo muy sencillo del uso de Java Reflection API se encuentra en la propia documentación de Sun. Se trata de un programa extremadamente sencillo que puede ser ejecutado desde la propia línea de comandos. Como parámetro de ejecución, le debemos pasar el nombre de una clase. El programa visualizará, utilizando Java Reflection API, una lista de todos los métodos públicos de la clase en cuestión.
Veamos el código fuente:
Ejemplo 1. Visualizar todos los métodos de una clase utilizando Java Reflection import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0]); Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].toString()); } catch (Throwable e) { System.err.println(e); } } } |
||
Si ejecutamos el programa pasando el argumento: java.util.Stack, el resultado será el siguiente:
public java.lang.Object java.util.Stack.push(El programa no solamente visualiza el nombre de los métodos, sino que además visualiza los parámetros de cada uno de los métodos, así como sus respectivos valores de retorno. Vamos a ver un poco más de cerca el código. Primero lo que hacemos es crear un objeto Class de la clase sobre la cual deseamos obtener información. A través de una llamada al método getDeclaredMethods() obtendremos una lista de métodos (almacenados en un array de objetod Method). Una vez tengamos el array de métodos podemos realizar cualquier tipo de operación con el método… en el ejemplo anterior, lo que hemos hecho ha sido obtener la descripción del método (clase que retorna la llamada al método, nombre del método y parámetros), pero también podemos ejecutar el método de la clase en cuestión haciendo uso de la clase Method. Otra de las posibilidades de Java Reflection es obtener una lista de los campos (variables) de una clase determinada. Veamos el siguiente ejemplo.
Ejemplo 2: Visualizar las variables públicas de una clase import java.lang.reflect.*; public class field1 { private double d; public static final int i = 37; String s = "testing"; public static void main(String args[]) { try { Class cls = Class.forName("java.awt.Button"); Field fieldlist[] = cls.getDeclaredFields(); for (int i = 0; i < fieldlist.length; i++) { Field fld = fieldlist[i]; System.out.println("name = " + fld.getName()); System.out.println("decl class = " + fld.getDeclaringClass()); System.out.println("type = " + fld.getType()); int mod = fld.getModifiers(); System.out.println("modifiers = " + Modifier.toString(mod)); System.out.println("-----"); } } catch (Throwable e) { System.err.println(e); } } } |
||