Reflexión en Java IV, ejecución de un método sin parametros
February 1st, 2011 by pako received No Comments »Después de un buen rato de no seguir con los post de reflexión por varios motivos, pero movido por la inquietud de @Carlos La Serna, he decido retomar los post =),
Bueno en esta ocasión trataré de mostrar como se pueden ejecutar los métodos de una clase que no reciban parámetros, por lo pronto sera una clase que conozcamos para no complicar tanto el ejercicio aunque como ya demostré en los post anteriores podríamos no conocerla y manejar reflexión para conocerla pero esto lo dejare para posts posteriores.
para ver como ejecutar los métodos me he creado estas clases que simulan una consola de comandos, primero una versión del cmd, que no utiliza reflexión
excecv1.java
package reflexion;
import java.util.Scanner;
/**
*
* @author fcodiaz
*
*/
public class execv1 {
public static void main(String a[]){
Scanner sc = new Scanner(System.in);
Cmd cmd=new Cmd();
String coman="";
while(true){
coman=sc.nextLine();
if(coman.equals("help")){
cmd.help();
}else if(coman.equals("about")){
cmd.about();
}else if(coman.equals("exit")){
cmd.exit();
}else if(coman.equals("hello")){
cmd.hello();
}else{
System.out.println("el comando " + coman + " no existe ");
}
}
}
}
y aquí la clase que contiene los comandos
cmd.java
package reflexion;
/**
*
* @author fcodiaz
*/
public class Cmd {
public Cmd() {
System.out.println("ejecuta el comando help para obtener ayuda!");
}
public void help(){
System.out.println("Quieres ayuda =)n"
+ "Lista de Comandos:n"
+ " - hello : muestra un saludon"
+ " - exit : cierra el CMDn"
+ " - about : info de quién hizo esta cosa!");
}
public void exit(){
System.out.println("Bye!!");
System.exit(0);
}
public void hello(){
System.out.println("Hola Mundo!!!");
}
public void about(){
System.out.println("By FcoDíaznwww.devtics.com.mx");
}
}
como verán para esta versión necesitamos conocer la clase cmd en el momento de codificar. para hacerlo con reflexion necesitamos obtener el objeto java.lang.reflect.Method del método que deseemos ejecutar para ellos antes debemos de obtener el java.lang.Class del objeto que contenga el método a ejecutar.
en nuestro ejercicio sera la clase de un objeto Cmd
Cmd cmd = new Cmd(); Class _classCmd = cmd.getClass();
Con ello tenemos el java.lang.Class en _classCmd del objeto cmd ahora para obtener el java.lang.reflect.Method haremos uso java.lang.Class.getMethod(String nombreMethod)
Method method = _classCmd.getMethod("help");
con esto buscamos el método “help” dentro del java.lang.Class, si no se encuentra ningún Method se lanzará una excepción java.lang.NoSuchMethodException, si lo encuentra lo retornará y lo asignamos a “method”
para ejecutar hay que invocarlo desde el objeto java.lang.reflect.Method (method) para ello usamos su mentodo .invoque(Object ObjetoQueContieneElMetodo)
method.invoke(cmd);
en este caso se esta llamando ejecutar al método “help()” que no contenga parámetros en el objeto cmd
para finalizar aquí esta la versión “final” del CMD utilizando reflexión
package reflexion;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
/**
*
* @author fcodiaz
*/
public class exec {
public static Scanner sc = new Scanner(System.in);
public static void main(String args[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Cmd cmd = new Cmd();
String coman = "";
while (true) {
try {
coman = sc.nextLine();
Class _classCmd = cmd.getClass();
Method method = _classCmd.getMethod(coman);
method.invoke(cmd);
} catch (NoSuchMethodException e) {
System.out.println("el comando " + coman + " no existe ");
}
}
}
}
como verán es un programa mas pequeño que la primera versión, ademas de que al usar reflexión para ejecutar el “comando” en exec.java no tendremos que conocer la estructura de la clase cmd.java y con ello podemos agregarle métodos al cmd.java sin tener que tocar exec.java, pues hasta aqui este post, aun me queda mucho por mostrar reflexión
Download Proyecto Netbeans 6.9
Tags: Java, jse, reflexiòn, reflexion jse
Posted under: Java






