2010-01-19 23 views
14

¿Cómo descargar una clase del cargador de clases, para que pueda usar la clase recientemente modificada sobre la marcha sin reiniciar mi aplicación (implementación activa)? ¿Es posible hacer eso?¿Cómo descargar una clase ya cargada en Java?

+3

Véase también http://stackoverflow.com/questions/148681/unloading-classes-in-java – Vadzim

Respuesta

4

No puede descargar una clase que esté realmente en uso. Pero es posible que desee echarle un vistazo a plataformas como OSGi, si desea volver a cargar o volver a implementar su aplicación durante el tiempo de ejecución.

6

Java rebel reloads cambió las clases sobre la marcha. Ver the jrebel website for details. Sin embargo, no sé si lo recomendaría para un entorno de producción debido a problemas de rendimiento. JRebel ocasionalmente empantana las cosas momentáneamente cuando recompilaste para un servidor.

4

Usted no puede explícitamente descargar una clase.

En principio, puede expicitly recargar una clase a través de Classloader.loadClass(). A partir de ese momento, todas las instancias nuevas de esa clase usarán la nueva definición.

En cualquier caso, me gustaría proceder con extrema cautela ...

2

Usted tendría que crear una costumbre ClassLoader: que devuelve todos los Object s envueltos dentro de un proxy. El ClassLoader debe tener una lista de todos los Proxies referenciados (mantenga esta lista WeakReference d). Si decide "descargar" y, por lo tanto, "volver a cargar" cualquier clase, espere hasta que se cargue la clase, encuentre todos los Proxy en su lista y reemplace el objeto real.

Existen varios problemas: necesita Reflection, para obtener todas las variables privadas y restablecer el estado interno (consulte setAccesible en Field). También pueden aparecer problemas de subprocesamiento múltiple, por lo que el Proxy debe sincronizarse: lo que hace que tenga un rendimiento bajo.

Puede buscar mejor la solución de dependencia Guice de Google, que permite desenchufar y volver a cargar módulos en tiempo de ejecución. Esta podría ser una solución, pero demasiado hinchada para una aplicación pequeña. Aún así: no estoy seguro de si el GC también descarga las clases no utilizadas.

Cuestiones relacionadas