Reflection puede servir para crear entornos de desarrollo visuales, herramientas que sirvan para realizar pruebas a algún componente, herramientas de depuramiento (aka debugging) o algún marco de trabajo que cree instancias e inyecte propiedades de objetos a partir de un archivo de configuración
Así que está vez muestro una clase que realizó un compañero de trabajo ya hace algunos años y que permite crear instancias y/o acceder a las propiedades (a tráves de los métodos accesores) de manera reflexiva. Esta es una herramienta muy útil ya que permite obtener propiedades de objetos de manera que podemos usarla para ordenar beans de manera mas general sin tener que definir un comparator para cada bean dependiendo de la propiedad que se desee comparar, convertir una lista de un beans en un mapa o crear listas de con alguna de las propiedades del bean.
/*
* GenericBean.java
*
* Created on 22 de junio de 2006, 09:32 PM
*
*/
/**
*
* @author JM
*/
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class GenericBean {
private Object o;
private Class beanClass;
/** Creates a new instance of GenericBean */
public GenericBean(String className) {
try {
beanClass = Class.forName(className);
Constructor c = beanClass.getConstructor();
o = c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public GenericBean(Object instance) {
o = instance;
beanClass = o.getClass();
}
public Object get(String property) {
Object ret = null;
property = property.substring(0, 1).toUpperCase()
+ property.substring(1);
try {
String methodName = "get" + property;
Method method = beanClass.getMethod(methodName);
ret = method.invoke(o);
}
catch(Exception e) {
try {
String methodName = "is" + property;
Method method = beanClass.getMethod(methodName);
ret = method.invoke(o);
}
catch(Exception ex) {
e.printStackTrace();
}
}
return ret;
}
public void set(String property, Object value) {
property = property.substring(0, 1).toUpperCase()
+ property.substring(1);
try {
Method method = beanClass.getMethod("set" + property, value
.getClass());
method.invoke(o, value);
} catch (Exception e) {
e.printStackTrace();
}
}
public Object getObject() {
return o;
}
public Class getObjectClass() {
return o.getClass();
}
}
Mañana escribiré como poder usar esta clase, porque la verdad ahorita ya es un poco noche jeje y ya me estoy quedando dormido. Sólo como recordatorio adicional, es importante recordad que utilizar Reflection genera bajas en el performance la máquina virtual ya que muchas veces no es posible utilizar los optimizadores con los que cuenta la JVM, como pueden ser en multiples llamadas a métodos, recursiones de cola etc...
Saludos
Gus
0 comments:
Post a Comment