2012-03-22 11 views
12

Quiero crear un nuevo ClassLoader cada vez que se llama a mi método.Crear nuevo ClassLoader para recargar Clase

Así que puedo volver a cargar class sin salir de mi programa.

Una manera de cómo puedo actualizar un class cargado por ClassLoader también sería una solución.

¿Cómo puedo lograr eso?

+0

Cargué una clase compilada de código fuente de JavaCompiler con loadClass ("cadena"), luego ejecuto esta clase con JUnitCore. Después de eso, edito el código fuente en * .java, lo compilo con JavaCompiler y quiero volver a cargarlo. – ctekk

+1

Pregunta interesante para un buen caso de uso. +1 –

Respuesta

8

He encontrado una buena respuesta se explica aquí:

http://www.exampledepot.com/egs/java.lang/reloadclass.html

Lo importante es tener dos carpetas de archivos binarios, en mi caso: uno para los casos de prueba y otro para la fuente del programa.

Cita:

URL[] urls = null; 
try { 
    // Convert the file object to a URL 
    File dir = new File(System.getProperty("user.dir") 
     +File.separator+"dir"+File.separator); 
    URL url = dir.toURL();  // file:/c:/almanac1.4/examples/ 
    urls = new URL[]{url}; 
} catch (MalformedURLException e) { 
} 

try { 
    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class 
    Class cls = cl.loadClass("MyReloadableClassImpl"); 
+0

Solo para agregar: esta solución solo funciona si su clase recargada no tiene ninguna eliminación de método/nueva referencia de clase. El problema con este enfoque es que si alguien se propone agregar clases dependientes primero, esto podría crear NoClassDefFoundError. Lo mejor es volver a cargar todas las clases sin detener por completo la aplicación. – ha9u63ar