Duda con Reflection

Hola buenos días:
Hace unos días hice una pregunta a cerca de la carga de clases con classloader y me respondisteis que debería usar reflection.
Pues bien, estoy intentando usar reflectios sin embargo, cuando voy a cargar la clase tengo problemas:
Con el siguiente código no tengo problemas:
         //clase que vamos a instanciar
         String c = "A_Mano_2";
        //Constructor: Es el único q tiene y no tiene parámetros
        Class cArgParaConstructor[] = {String.class};
        Object oParamParaConstructor[] = {new String("Demo Reflexión")};
        //llamamos al método que tiene setEtiqueta(String s)
        String nombreMetodo = "setEtiqueta";
        Class cArgMetodo[] = {String.class};
        Object oParamMetodo[] = {new String("Hola Holita, vecinito")};
        //instanciamos la clase
        clase = Class.forName(c);
        Constructor constructorClaseInstanciada = clase.getConstructor(cArgParaConstructor);
        Object obj = constructorClaseInstanciada.newInstance(oParamParaConstructor);
        //Object obj = clase.newInstance(); //no le metemos parámetros porq el constructor no tiene parámetros
        //invocamos el método
        metodo = clase.getMethod(nombreMetodo,cArgMetodo);
        metodo.invoke(obj,oParamMetodo);        
Sin embargo, si en lugar de poner String c = "A_Mano_2" pongo la ruta completa de la clase
String c = "H:/Documents/cosas_de_java/Ejemplo_Carga_Modulos/build/classes/A_Mano_2"
No me funciona.
Lo que me interesa es poder cargar clases que se encuentren fuera del directorio de la aplicación.
¿A qué puede ser debido?
Muchas gracias.
Respuesta
1
El error que te provoca es porque la carga de clases en el classloader se hace en relación con el classpath actual, es decir, si la clase no está en el classpath no puedes cargarla (y menos usando una ruta absoluta).
Para poder cargar esta clase "externa" debes de usar un classloader propio para recuperar esta clase, algo como :
File ficheroClase1 = new File (".... clase 1.class");
ClassLoader loader = this.getClass().getClassLoader();
URL[] urls = new URL [] {
ficheroClase1.toURL()};
URLClassLoader nuevo = new URLClassLoader (urls,loader);
Class clase = nuevo.loadClass("esta.es.tu.Clase");
...
Y hacer el resto de las operaciones que tienes hechas, pero usando este classloader. Ten en cuenta que la visibilidad de las clases depende por lo tanto del classloader en que esté instanciada la clase.
Otra opción es usar el método "defineClass", que es protegido, pero que permite cargar la clase dentro del classloader actual. Échale un vistazo a esta página que te da una solución
http://asm.objectweb.org/doc/faq.html#Q5

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas