[Java] Dynamisches Laden

Nr. Gravatar

Programm sehr oft das Gefühl, die Notwendigkeit, zusätzliche Teile des Codes in ein System einfügen während seiner Nutzung (man denke zum Beispiel der Möglichkeit, Plug in einem Antrag, müssen sie sofort nach ihrer "Anlage" verwendet werden) sehen wir wie und in welchem Rahmen, ist dies mit der Sprache der Sonne erreicht werden

Kompilieren zur Laufzeit:

Erstens ist es nützlich zu wissen, dass von jedem Java-Anwendung aufrufen kann der Compiler (javac) mit den üblichen Parametern (classpath und alles andere) mit einem einfachen

  new String [ ] { Main. Kompilieren (new String [] (
 , "-d", "bin /",
 filename + ".java" } ) ; "src / generatedCode /" + filename +. "java")); 

NB: für die verschiedenen Parameter (I left out viele, darunter auch die Möglichkeiten der Zusammenstellung) Ich lasse die Dokumentation von APIs.

Loading:

Denn Sie haben die Datei. Von Klasse zu unserer Anwendung haben wir 2 Straßen, ausgehend von der Annahme aus, dass wir den Namen der Klasse kennen zu laden:

  1. Wenn wir keine spezifischen Informationen über die Klasse ableiten, durch die Mechanismen des Nachdenkens und der Instanziierung Methoden;
  2. Wenn wir den "Plugin" strukturierten haben zu einer bekannten Schnittstelle implementieren, um ein Objekt zu erzeugen (wie wir gleich sehen werden) und rufen Sie die Methoden des Interfaces.

2 I wird der Fall betrachtet werden, da sonst zu viel schweife auf ein Thema, das ziemlich kompliziert ist und interessante Überlegung.

Betrachten Sie den folgenden Fall:

Klasse A (die, die wir laden wollen) B implementiert das Interface.

  new ClassLoader ( ) ; ClassLoader loader = new ClassLoader ();
 gt ; cls = loader. loadClass ( "A" ) ; Klasse & lt;? & Gt; cls = Loader. LoadClass ( "A");
 B ) cls. newInstance ( ) ; Istanza_di_A B = (B) cls. NewInstance ();
 ... ) ; istanza_di_A. metodoDiA (...); 

Wie Sie den Prozess sehen können, ist sehr einfach zu implementieren, mal sehen, was jetzt ist das wichtigste Einschränkung.

UnloadingReloading:

Leider hat die JVM nicht zulassen, dass das Entladen von Klassen geladen Bytecode auf.
Betrachten wir die Idee der Änderung des Codes der Klasse einmal nach instanziieren ein Objekt dieses Typs in unserem Programm. Wir würden, würde als natürlich erscheinen, dass einmal geladen Bytecode der Klasse verändert und neu kompiliert haben, "die neuen Objekte des Typs A" erstellt werden, nach den neuesten verfügbaren Version.

Leider ist dies nicht geschehen, so sehen wir, warum.
Der Classloader, die wir zuvor benutzt, um "Ladung" in Erinnerung an unsere Klasse Bytecode zur Laufzeit, wie wir gesagt haben, kann nicht (manuell oder automatisch) zu handhaben das Entladen von Klassen instanziiert durch die Anwendung. Zum Zeitpunkt der Schaffung eines Objekts ist nur auf den folgenden Algorithmus (die weiter tragen eine sehr vereinfacht):

  1. Prüfen Sie auf einer Datenstruktur (einer Hash-Tabelle), wenn es einen Eintrag für die Klasse, die er gebeten wurde, indem sie mit den Namen der Klasse ( "class_name" -> "Bytecode") zu laden;
  2. Wenn Sie keine passenden Einträge in den Namen zu finden und schafft ein, nach dem Lesen der Datei. Klasse, speichern Sie die Bytecode in einer solchen Struktur dann gibt eine Instanz des Programms.
  3. Alternativ, wenn Sie einen Eintrag für den Namen der Klasse, ist in keiner Weise zu beurteilen, ob der Bytecode aktualisiert wird oder nicht betroffen; instanziiert ein Objekt aus Bytecode gespeichert und an das Programm zurückgegeben.

Wie Sie sich vorstellen, dann werden die Änderungen nur wirksam werden, wenn Sie das Programm neu starten.
Der einzige vorhandene Lösung ist, um eine benutzerdefinierte ClassLoader diesem Fall beschäftigen wir uns mit caricareistanziare Klassen, die wir als ein Stecker verwenden und dass, sobald eine Veränderung auftritt, können wir "wegwerfen" (indem alle Verweise auf null möchten Umsetzung) reinstanziarene für eine neue Anwendung, die Pflege der Verwaltung des neuen Code in den privaten Datenstruktur nimmt.

Umständliche echte Lösung? Nun, wenn er nicht gut für die Aktualisierung der NDERUNGEN Tomcat JSPs würde sagen, es ist angemessen, anpassen :)

Popularity: 19% [?]

Stichwort:


leave a response , or trackback from your own site. Sie können alle Antworten auf diesen Eintrag durch den RSS 2.0 Feed verfolgen. Sie können ein Antwort, oder einen Trackback auf deiner Seite hinterlassen.

AddThis Social Bookmark Button

Diese Website benutzt IntenseDebate comments, aber sie sind derzeit nicht Denn entweder Ihr Browser unterstützt kein JavaScript, oder sie wurde nicht geladen schnell genug geladen wird.

Lassen Sie eine Antwort