Академический Документы
Профессиональный Документы
Культура Документы
La API Reflection nos permite acceder a lo que la buena programacin orientada a objetos nos ha ocultado: las estructuras internas de los objetos que manejamos. As, con Reflection, podemos saber la clase de un objeto, sus mtodos, sus atributos Entre las operaciones que podemos realizar se encuentran: cambiar los valores de atributos privados, invocar a mtodos por su nombre, etc. Reflection se utiliza mucho en debuggers o navegadores navegador de clases. Como bien advierte la documentacin oficial de Java, Java utilizar Reflection conlleva una serie de riesgos y problemas. De rendimiento, de seguridad. Porque utilizar Reflection conlleva pasarse por el forro (casi) todos los principios de la Programacin Orientada a Objetos y un cero en cualquier examen de programacin serio, pero tambin es cierto que, utilizndolo de manera correcta y con responsabilidad, se pueden conseguir conseguir algunas cosas muy chulas que de otra manera seran imposibles.
Class, , representando una clase. Que contiene: Field, , representando un atributo, y Method, , representando un mtodo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
import java.util.List; import javax.swing.JButton; public class MyClassToBeViolated { private int integerX; private String aString; public Double d; public char getAChar(int i, Object object) { return 'a'; } public Object getAnObject(String string, List<JButton> list) { return null; } }
Hemos puesto algunos atributos y un par de mtodos, para a continuacin, utilizando Reflection, explorarlos. Nos hacemos un main sencillo para probar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { public static void main(String args[]) { MyClassToBeViolated object = new MyClassToBeViolated(); Class<?> clazz = object.getClass(); System.out.println("Nombre de la clase: " + clazz.getName()); System.out.println("Que tiene los siguientes atributos:"); for (Field f : clazz.getDeclaredFields()) { System.out.println(f.getName() + " que es de la clase " + f.getType().getName()); } System.out.println( "Y los siguientes mtodos:"); for (Method m : clazz.getDeclaredMethods()) { System.out.println(m.getName()); for (Class<?> c : m.getParameterTypes()) { System.out.println(" tiene un parmetro de la clase c.getName()); } } } }
Y al ejecutar obtenemos:
1 2 3 4 5 6 7 8 9 10 11 12
Nombre de la clase: MyClassToBeViolated Que tiene los siguientes atributos: integerX que es de la clase int aString que es de la clase java.lang.String d que es de la clase java.lang.Double Y los siguientes mtodos: getAChar tiene un parmetro de la clase int tiene un parmetro de la clase java.lang.Object getAnObject tiene un parmetro de la clase java.lang.String tiene un parmetro de la clase java.util.List
Y obtenemos informacin literal sobre la clase que hemos definido. Reflection es una herramienta poderosa, pero aqu vamos a ceirnos slo a la funcionalidad que se requiera para nuestras animaciones.
Te ha parecido:
5 comentarios:
Annimo dijo... Hola Estamos haciendo un proyecto sobre la reflexion y tenemos un problema para cargar las clases externas al classpath. Hemos visto la solucion que propones y la tenemos
similar salvo una linea ClassLoader loader = this.getClass().getClassLoader(); No entendemos mmuy bien esta linea Como se llama la clase donde ejecutas el ClassLoader? Si nos puedes mandar tu classLoader te lo agradeceriamos mucho pues estamos estancados en el proyecto. Un Saludo perla y gracias 22/04/08 17:49
Guevonaso dijo... Esta es una clase cualquiera, no tengo definido ningun ClassLoader, el ejemplo era muy simple y para mi caso concreto funcion, pero no pude hacer pruebas exaustivas. La case era tan simple como : class MIClase { .... public void ejecuta() { // El codigo de arriba } public static void main(String[] args) { new MiClase ().ejecuta(); }}