El problema en términos generales es el modelo de seguridad de Java que en realidad intenta evitar que una clase que tiene ya se ha cargado se cargue de nuevo.
Por supuesto, Java desde el principio ha soportado la carga de clase dinámica, lo que es difícil es la carga de clase.
Se consideró dañino (y por una buena razón) que una aplicación Java en ejecución se inyectó con una nueva clase con código malicioso. Por ejemplo, una implementación craqueada de java.lang.String procedente de Internet, que en lugar de crear una cadena, elimina algún archivo aleatorio que invoque el método length().
Entonces, la manera en que se concibió Java (y supongo que .NET CLR en consecuencia, porque estaba muy "inspirado" en JVM) fue para evitar que una clase ya cargada cargue de nuevo esa misma máquina virtual.
Ofrecieron un mecanismo para anular esta "característica". Los cargadores de clases, pero una vez más las reglas para los cargadores de clase era que deberían pedir permiso al cargador de clases "padre" antes de intentar cargar una nueva clase, si el padre ya ha cargado la clase, se ignora la nueva clase.
Por ejemplo he utilizado cargadores de clases que se cargan a clases de LDAP o RDBMS
El despliegue en caliente se convierte en una necesidad en el mundo Java cuando el servidor de aplicaciones se convirtió en la corriente principal para Java EE (así como crear la necesidad de contenedores micro como la primavera para evitar este tipo de carga).
Reiniciar todo el servidor de aplicaciones después de cada compilación vuelve loco a cualquiera.
Por lo tanto, el proveedor de servidor de aplicaciones, ofrece estos cargadores de clases "personalizados" para ayudar a la implementación en caliente, y al usar un archivo de configuración, ese comportamiento DEBERÍA desactivarse cuando se establezca en producción. Pero la compensación es que tienes que usar toneladas de memoria en desarrollo. Entonces, la buena forma de hacerlo es reiniciar cada 3 o 4 implementaciones.
Esto no sucede con otros lenguajes que fueron diseñados desde el principio para cargar sus clases.
En Ruby, por ejemplo, incluso puede agregar métodos a una clase en ejecución, anular un método en tiempo de ejecución o incluso agregar un único método a un objeto específico único.
La compensación en este tipo de entornos es, por supuesto, la memoria y la velocidad.
Espero que esto ayude.
EDITAR
He encontrado este producto hace algún tiempo que promete que la recarga es hacer lo más simple posible. No recuerdo el enlace cuando escribí esta respuesta por primera vez, y lo hago.
Es JavaRebel from ZeroTurnaround
¿Por qué esta Wiki de la comunidad, por cierto? – Eddie
Pensé que podría ayudar en caso de que dejara algo poco claro ... ¿eso es por defecto, es una mala etiqueta? –
Gracioso: encontré una idea-o mientras volvía a leer en este momento, ¡gracias! –