Ejecutar metodos desde un archivo Por motivos que no vienen al caso me tuve que enfrentar al siguiente problema. Tenia que crear un servlet que recibiera como parámetro el nombre de la classe del objeto que se quería crear y el nombre del método que se quería ejecutar. Así, se podía tener un servlet que fuera capaz de ejecutar cualquier acción sin necesidad de ser previamente conocida. Bueno, la cosa es bastante sencilla, aunque me llevó un ratito dar con la solución.
Class[] classParam = null;
Object[] objectParam = null;
String name = "org.mypackage.test.ClassTest";
String method = "run";
try {
Class cl = Class.forName(name);
java.lang.reflect.Constructor co = cl.getConstructor(classParam);
Method m = cl.getMethod(method ,classParam);
m.invoke(co.newInstance(objectParam),classParam);
} catch (SecurityException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (NoSuchMethodException e) {
System.out.println(e.getMessage());
} catch (IllegalAccessException e) {
System.out.println(e.getMessage());
} catch (InvocationTargetException e) {
System.out.println(e.getMessage());
} catch (InstantiationException e) {
System.out.println(e.getMessage());
}
Este pedacito de código creará un objeto de tipo ClassTest y lanzará su metodo run.
Si os preguntais para qué sirve algo así, pues a mi me sirve para definir la arquitectura de RainDrop. La idea es tener una librería core con toda la funcionalidad del dispatcher pero que permitar "enchufar" otras librerías. Por ejemplo, ahora puedo externalizar las acciones que se ejecutan en mi aplicacion web. (2005-01-04 12:21:20.0)
Permalink
Comentarios [4]


en javaalmanac.com encontraras muchos truquillos por el estilo: http://javaalmanac.com/egs/java.lang.reflect/pkg.html
Si no vas a dar un tratamiento a cada excepción, no te cortes y pon catch(Exception e).
Enviado por jano en January 04, 2005 a las 09:25 AM EST #
Yo hace tiempo me enfrente a un problema similar (de hecho es un prblema bastante comun el tener que usar reflect para la generar *dinamicamente* funcionalidad) Si me permites un consejo (o dos) saca el codigo de relexión fuera del servlets, tenerlo hay solo te traera porblemas a la larga. si despues quieres cambiar la forma de cargar las clases o quieres añadirles la capacidad de cachearlo objetos para no estar creandolos una y otra vez. yo creo recordar que cree una serie interfaces y objetos algo asi :
1) public Action Actionfactory.getAction(parametros necesarios): Metodo estatico para crearme el objeto que quisiese y para cachear y reutilzar los objetos
2) public interface Action{
doBefore();
run(); //
doAfter();
}
esta interfaz la implementa (Adapter) el objeto que quiero llamar y run se encarga de llamar al/los metodo/s que hiciese falta
Perdon por el ladrillo, se nota que hoy no tengo nada que hacer
Enviado por Akuma en January 04, 2005 a las 10:05 AM EST #
jano, de poner <code>catch (Exception e)</code> ni hablar, que entonces capturas las <i>RuntimeException</i> también... y no interesa! ;)
Enviado por emillan en January 04, 2005 a las 11:28 AM EST #
depende. en este caso haria<code>
catch(Exception e){
throw new RuntimeException(e);
}
</code>y pondria un controlador global de excepciones, aunque <a href="http://www.1x4x9.info/files/excepciones/html/online-chunked/ar01s03.html">depende</a> del caso.
Enviado por jano en January 05, 2005 a las 06:08 AM EST #