Vor etwa einem Jahr bin ich über eine nette Funktion in Java gestolpert, die ich nicht für das Leben von mir wieder finden kann.
Durch eine magische Schnittstelle war es offensichtlich möglich, einige Klassen oder Funktionen zur Laufzeit austauschbar zu machen.
Ich fand ein gutes Beispiel für jemanden, der ein einfaches Programm mit einer bestimmten Nachricht erstellt hat. Dann hat er das Programm mit einer Methode aktualisiert, an die ich mich nicht mehr erinnern kann, und plötzlich hat das Programm diese alte Druckfunktion durch eine neue ersetzt.
Ich habe versucht, durch die Java-API zu schauen, um sowohl mein Gedächtnis als auch das Googlen zu erzeugen, aber ohne Erfolg. Kann hier jemand helfen?
Verschiedene App-Container können dies tun.
Grundsätzlich müssten Sie die Klasse in einem neuen %code% neu laden (es sei denn, Sie sprechen darüber unter dem Debugger, in diesem Fall gibt es völlig andere APIs verfügbar).
Meiner Meinung nach lohnt sich die Sache nur selten: Alles so zu gestalten, dass es neu geladen werden kann, ist wesentlich schwieriger als das Entwerfen, sodass es in einem neuen Prozess komplett neu gestartet werden kann. Es ist auch einfacher sicher zu sein, welcher Code gerade ausgeführt wird, wenn nur eine Version in den Prozess geladen wird.
Es ist eine nette Sache, eine Demo zu erstellen, aber für meisten Anwendungen lohnt es sich nicht. Alles meiner Meinung nach natürlich:)
Beachten Sie, dass eine wichtige Ausnahme die Möglichkeit ist, Web-UI-Layer neu zu laden, ohne den Container neu zu starten: das kann das Leben viel erleichtern.
Das ist normalerweise die Art von Funktionalität, die ich der Infrastruktur gerne hinterlasse, da es schwierig ist, richtig und leicht falsch zu geraten. Wie Jon oben erwähnt, die meisten Anwendungen brauchen es nicht und für diejenigen, die es brauchen Infrastruktur ist verfügbar.
Die meisten Anwendungsserver erlauben heutzutage eine Hot-Deployment, und ebenso sind die meisten Anwendungsserver einbettbar und erlauben es, diese zu entfernen, um Features zu entfernen, die Sie nicht benötigen.
Wenn es hauptsächlich für die Entwicklung ist, sollten Sie einen JRebel suchen, der diese Funktionalität transparent bereitstellt. Ich habe gehört, dass sie an einer Runtime-Lösung arbeiten, aber ich weiß nicht, ob sie zur Primetime bereit ist.
Wenn Sie wirklich motiviert sind, dies zum Laufen zu bringen, sollten Sie OSGi verwenden. Es hat eine steile Lernkurve, aber wenn man es erst einmal gemacht hat, macht es die meisten Dinge richtig und funktioniert sehr gut. Ich fand die Pax-Tools als guten Ausgangspunkt, aber die Eclipse-Toolchain bietet auch eine gute Unterstützung dafür.
Die HotSwap -Technologie wurde zu Java 1.4 hinzugefügt und aktiviert zur Laufzeit die Klassendatei replacement . Die Funktion wird über die %code% Methode der Instrumentierung Paket. Ich denke, Sie können dies auch über die JPDA -Schnittstelle tun.
Hier ist auch ein Verweis auf das, was ich glaube, ist die Forschungsarbeit, die den HotSwap-Mechanismus zuerst beschreibt:
Ansonsten können Sie Classloader verwenden, wie in der anderen Erwähnung, aber nur dynamisches Laden von Klassen , nicht Ersatz. Dieselbe Klasse, die zweimal geladen wird, wird als zwei verschiedene Arten betrachtet. Kombiniert mit einer Schnittstelle und / oder ein wenig Reflektion, kann es jedoch Möglichkeiten bieten, die Anwendung zur Laufzeit zu aktualisieren.
Hier ist ein Verweis auf ein tolles Paper über Klassenlader und dessen Verwendung:
Ich werde nicht darauf eingehen, ob das gut oder schlecht ist, weil es nicht Ihre Frage war, aber ich finde es großartig, Unterstützung für die Laufzeit-Softwareentwicklung zu haben - schade, dass JSR-117 hat es nie geschafft!
Vor etwa einem Jahr bin ich über eine nette Funktion in Java gestolpert, die ich nicht für das Leben von mir wieder finden kann.
Durch eine magische Schnittstelle war es offensichtlich möglich, einige Klassen oder Funktionen zur Laufzeit austauschbar zu machen.
Ich fand ein gutes Beispiel für jemanden, der ein einfaches Programm mit einer bestimmten Nachricht erstellt hat. Dann hat er das Programm mit einer Methode aktualisiert, an die ich mich nicht mehr erinnern kann, und plötzlich hat das Programm diese alte Druckfunktion durch eine neue ersetzt.
Ich habe versucht, durch die Java-API zu schauen, um sowohl mein Gedächtnis als auch das Googlen zu erzeugen, aber ohne Erfolg. Kann hier jemand helfen?
Verschiedene App-Container können dies tun.
Grundsätzlich müssten Sie die Klasse in einem neuen ClassLoader
neu laden (es sei denn, Sie sprechen darüber unter dem Debugger, in diesem Fall gibt es völlig andere APIs verfügbar).
Meiner Meinung nach lohnt sich die Sache nur selten: Alles so zu gestalten, dass es neu geladen werden kann, ist wesentlich schwieriger als das Entwerfen, sodass es in einem neuen Prozess komplett neu gestartet werden kann. Es ist auch einfacher sicher zu sein, welcher Code gerade ausgeführt wird, wenn nur eine Version in den Prozess geladen wird.
Es ist eine nette Sache, eine Demo zu erstellen, aber für meisten Anwendungen lohnt es sich nicht. Alles meiner Meinung nach natürlich:)
Beachten Sie, dass eine wichtige Ausnahme die Möglichkeit ist, Web-UI-Layer neu zu laden, ohne den Container neu zu starten: das kann das Leben viel erleichtern.
Die HotSwap -Technologie wurde zu Java 1.4 hinzugefügt und aktiviert zur Laufzeit die Klassendatei replacement . Die Funktion wird über die redefineClasses
Methode der Instrumentierung Paket. Ich denke, Sie können dies auch über die JPDA -Schnittstelle tun.
Hier ist auch ein Verweis auf das, was ich glaube, ist die Forschungsarbeit, die den HotSwap-Mechanismus zuerst beschreibt:
Ansonsten können Sie Classloader verwenden, wie in der anderen Erwähnung, aber nur dynamisches Laden von Klassen , nicht Ersatz. Dieselbe Klasse, die zweimal geladen wird, wird als zwei verschiedene Arten betrachtet. Kombiniert mit einer Schnittstelle und / oder ein wenig Reflektion, kann es jedoch Möglichkeiten bieten, die Anwendung zur Laufzeit zu aktualisieren.
Hier ist ein Verweis auf ein tolles Paper über Klassenlader und dessen Verwendung:
Ich werde nicht darauf eingehen, ob das gut oder schlecht ist, weil es nicht Ihre Frage war, aber ich finde es großartig, Unterstützung für die Laufzeit-Softwareentwicklung zu haben - schade, dass JSR-117 hat es nie geschafft!
Das ist normalerweise die Art von Funktionalität, die ich der Infrastruktur gerne hinterlasse, da es schwierig ist, richtig und leicht falsch zu geraten. Wie Jon oben erwähnt, die meisten Anwendungen brauchen es nicht und für diejenigen, die es brauchen Infrastruktur ist verfügbar.
Die meisten Anwendungsserver erlauben heutzutage eine Hot-Deployment, und ebenso sind die meisten Anwendungsserver einbettbar und erlauben es, diese zu entfernen, um Features zu entfernen, die Sie nicht benötigen.
Wenn es hauptsächlich für die Entwicklung ist, sollten Sie einen JRebel suchen, der diese Funktionalität transparent bereitstellt. Ich habe gehört, dass sie an einer Runtime-Lösung arbeiten, aber ich weiß nicht, ob sie zur Primetime bereit ist.
Wenn Sie wirklich motiviert sind, dies zum Laufen zu bringen, sollten Sie OSGi verwenden. Es hat eine steile Lernkurve, aber wenn man es erst einmal gemacht hat, macht es die meisten Dinge richtig und funktioniert sehr gut. Ich fand die Pax-Tools als guten Ausgangspunkt, aber die Eclipse-Toolchain bietet auch eine gute Unterstützung dafür.