Das Problem im Allgemeinen ist das Sicherheitsmodell von Java, das eigentlich zu verhindern versucht, dass eine bereits geladene Klasse erneut geladen wird.
Natürlich hat Java von Anfang an das dynamische Laden von Klassen unterstützt, was aber schwierig ist, ist das Nachladen von Klassen.
Es wurde als schädlich angesehen (und das aus gutem Grund), dass eine laufende Java-Anwendung mit einer neuen Klasse mit bösartigem Code injiziert wurde. Zum Beispiel eine geknackte java.lang.String-Implementierung aus dem Internet, die, anstatt einen String zu erstellen, eine zufällige Datei löscht, während sie die Methode length() aufruft.
Die Art und Weise, wie Java konzipiert wurde (und ich nehme an, dass dies auch für die .NET CLR gilt, da sie stark von den JVMs "inspiriert" wurde), sollte verhindern, dass eine bereits geladene Klasse erneut von derselben VM geladen wird.
Sie boten einen Mechanismus an, um diese "Funktion" außer Kraft zu setzen. Klassenlader, aber auch hier waren die Regeln für die Klassenlader, dass sie den "übergeordneten" Klassenlader um Erlaubnis bitten sollten, bevor sie versuchen, eine neue Klasse zu laden; wenn der übergeordnete Klassenlader die Klasse bereits geladen hat, wird die neue Klasse ignoriert.
Ich habe zum Beispiel Classloader verwendet, die eine Klasse aus LDAP oder RDBMS laden
Der Hot-Deploy wird zu einer Notwendigkeit in der Java-Welt, wenn der Anwendungsserver zum Mainstream für Java EE wird (und auch die Notwendigkeit für Mikrocontainer wie Spring schafft, um diese Art von Belastung zu vermeiden).
Der Neustart des gesamten App-Servers nach jeder Kompilierung macht jeden verrückt.
So App-Server-Anbieter, bieten diese "benutzerdefinierte" Class Loader, um heiße Bereitstellung zu helfen, und mit einer Konfigurationsdatei, dieses Verhalten, SOLLTE deaktiviert werden, wenn in der Produktion festgelegt. Aber der Kompromiss ist, müssen Sie Tonnen von Speicher in der Entwicklung zu verwenden. Also der gute Weg, dies zu tun ist Neustart alle 3 - 4 Bereitstellungen.
Bei anderen Sprachen, die von Anfang an darauf ausgelegt waren, ihre Klassen zu laden, ist dies nicht der Fall.
In Ruby zum Beispiel können Sie sogar Methoden zu einer laufenden Klasse hinzufügen, eine Methode zur Laufzeit überschreiben oder sogar eine einzelne Methode zu einem einzelnen spezifischen Objekt hinzufügen.
Der Kompromiss in dieser Art von Umgebungen ist natürlich der Speicher und die Geschwindigkeit.
Ich hoffe, das hilft.
EDIT
Ich habe vor einiger Zeit dieses Produkt gefunden, das verspricht, das Nachladen so einfach wie möglich zu machen. Ich erinnerte mich nicht an den Link, als ich diese Antwort zum ersten Mal schrieb, und ich tue.
Sie ist JavaRebel von ZeroTurnaround