Ejecución Dinámica de un método de una Clase JAva

Hola, el otro día me surgió la necesidad de ejecutar un método, que tenia un comportamiento diferente según la clase de la cual formara parte. Para entendernos mejor, lo que pasaba es que tenía dos clases una A y otra B. Que compartían un método con la misma firma, pero hacían cosas diferentes. En primer lugar pensé en usar un if , pero eso no me parecía tan elegante, ya que pensaba usar un fichero de properties y si en el futuro aparecía una tercera clase C . Así llegué a la conclusión que una buena forma era usar como parámetro el nombre de la clase a cargar e incluso el método. Por esa razón use el famoso Google, para buscar información. Y la verdad es que la encontré y de ella he creado estos ejemplo de código, por si les puede ayudar a alguien.

Clase que carga de forma dinámica:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class cargaDinamica {

/***
* Permite cargar un método en una clase indicada de forma dinámica
*
* @param a
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
public static void cargaDinamica (String clase, String metodoLlamado, String a)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

Object tempClass = Class.forName(clase).newInstance();

Class claseCargada = tempClass.getClass();
//Firma del metodo.
Class[] argumentos = new Class[1];
argumentos[0] = String.class;

//Busqueda del metodo a ejecutar
Method metodo = claseCargada.getDeclaredMethod(metodoLlamado, argumentos);
//Ejecucion del m?todo pasandole la clase de este y los parametros.
metodo.invoke(tempClass, a);

}

}

Simplemente se basa en cargar la clase que se le indica como parámetro, tras esto instanciamos esta clase y buscamos el método, según su firma. Y tras esto invocamos el método.

A continuación pongo el resto del ejemplo que puede servir para realizar pruebas y tener más claro estos conceptos.

Clase ejemplo a cargar y ejecutar:


public class clasePrueba {

public void imprimeA (String a) {

System.out.println("Valor de A => " + a);
}
}

Clase que realiza la ejecución del ejemplo:

import java.lang.reflect.InvocationTargetException;

import org.junit.Test;

public class testCargaDinamica {

@Test public void llamadaDinamica () {

try {
cargaDinamica.cargaDinamica("clasePrueba", "imprimeA", "Valor Pasado");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

Resultado de la ejecución:

Valor de A => Valor Pasado

Espero que les sirva a alguien.

Recursos interesantes:

Ficheros del Ejemplo:

Esta entrada fue publicada en Informática, Java y etiquetada , , , , . Guarda el enlace permanente.

12 respuestas a Ejecución Dinámica de un método de una Clase JAva

  1. Juanjo dijo:

    Ahora que ya tienes conocimientos de Java, a ver si te atreves con estas preguntas 😛

  2. eux251 dijo:

    He tratado de instalar tu codigo, pero me registra un error de ;
    java.lang.ClassNotFoundException: clasePrueba

    Seguramente es algo relacionado con la ubicacion de la clase Prueba.

    En donde debe estar este ubicado ?

    • davioth dijo:

      El fichero adjunto es un proyecto eclipse, que si importas a tu workspace, y se ejecuta como un test junit debe funcionar.

      Pero en concreto sobre la ubicación de la clase Prueba, esta debe estar en el classpath, por lo que supongo que si se ponen las tras clases juntas en el mismo directorio deben verse entre sí.

      Espero haberte ayudado: eux251

  3. Eduardo dijo:

    Gracias, Muy Buen aporte

  4. jacuqe dijo:

    ayudenme con un ejemplo facil para entender la excepcion NoSuchMethodException

    • davioth dijo:

      Esa Exception se lanza cuando se intenta ejecutar una función que no existe. Por ejemplo utilizar la función contains, propia de la clase String, en un objeto de clase Integer, es decir.

      int a = 25;
      a.contains(5) ===> Debería lanzar esa exception.

  5. mbenitezcol dijo:

    Muy buen aporte, gracias.

    me surge una duda, sabes como se debe hacer cuando las clases estan en paquetes diferentes????

    Gracias

  6. Juan dijo:

    Si lo ejecutas con una clase que es un Thread me da error:

    java.lang.InstantiationException: mipackage.subpaquete.ThreadEjemplo
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:325)

    Como podría hacer eso con un Thread??

  7. jmorales dijo:

    Gracias!
    El ejemplo es clarisimo.

  8. Rembrandt dijo:

    Gracias !! el ejemplo es muy claro.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *