
Dynamische Kompilierung und Laden externer Java-Klassen
Einführung
In bestimmten Szenarien ist dies der Fall wird notwendig, um Java-Klassen dynamisch aus externen Quellen zu kompilieren und zu laden. Ziel dieses Artikels ist es, eine umfassende Lösung zum Erreichen dieser Aufgabe bereitzustellen.
JavaCompiler: Der Schlüssel zur dynamischen Kompilierung
Die JavaCompiler-Klasse, bereitgestellt vom Java Development Kit (JDK ) bietet einen leistungsstarken Mechanismus zum dynamischen Kompilieren von Java-Quellcode in Klassendateien. Um diese Funktion zu nutzen, führen Sie die folgenden Schritte aus:
-
Erwerben Sie die JavaCompiler-Instanz: Rufen Sie eine Instanz der JavaCompiler-Klasse mit ToolProvider.getSystemJavaCompiler() ab.
-
Erstellen Sie einen DiagnosticCollector: Erstellen Sie ein DiagnosticCollector-Objekt, um alle Kompilierungsfehler oder Warnungen zu sammeln kann auftreten.
-
Konfigurieren Sie die Kompilierungsparameter: Erstellen Sie ein JavaCompiler.CompilationTask-Objekt, um den Kompilierungsprozess zu konfigurieren. Geben Sie die zu kompilierenden Quelldateien, den Klassenpfad (der benutzerdefinierte Bibliotheken enthalten kann) und alle Compileroptionen an.
-
Kompilierung aufrufen: Rufen Sie die call()-Methode für die CompilationTask auf Objekt. Dadurch wird der Kompilierungsprozess initiiert und der Rückgabewert zeigt an, ob er erfolgreich war.
Klassenladen und -ausführung
Sobald die Kompilierung erfolgreich abgeschlossen wurde, wird die dynamisch generiert Die Klasse kann mit einem benutzerdefinierten Klassenlader in die Java Virtual Machine (JVM) geladen werden:
-
Definieren Sie eine Klassenlader: Erstellen Sie einen benutzerdefinierten Klassenlader, indem Sie den URLClassLoader erweitern. Dieser Klassenlader sollte auf das Verzeichnis verweisen, in dem sich die kompilierten Klassendateien befinden.
-
Klasse laden: Verwenden Sie die Methode „loadClass()“ des benutzerdefinierten Klassenladers, um die gewünschte Klasse zu laden Vollqualifizierter Name.
-
Eine Instanz erstellen und ausführen: Ein Objekt der geladenen Klasse instanziieren und aufrufen seine Methoden, um die gewünschte Funktionalität auszuführen.
Beispielcode
Der folgende Codeausschnitt stellt eine Beispielimplementierung des dynamischen Kompilierens und Ladens dar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import javax.tools.*;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DynamicCompiler {
public static void main(String[] args) {
String sourceCode = ...;
compile(sourceCode);
loadAndExecute();
}
private static void compile(String sourceCode) {
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
File sourceFile = ...;
try (Writer writer = new FileWriter(sourceFile)) {
writer.write(sourceCode);
} catch (IOException e) {
e.printStackTrace();
}
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
CompilationUnit task = compiler.getTask(null, fileManager, diagnostics, null,
null, fileManager.getJavaFileObjectsFromFiles(Arrays.asList(sourceFile)));
task.call();
for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) {
System.out.println(diagnostic.getMessage(null));
}
}
private static void loadAndExecute() {
URLClassLoader classLoader = new URLClassLoader( new URL[] { new File( "." ).toURI().toURL()});
Class<?> loadedClass = classLoader.loadClass( "..." );
Object instance = loadedClass.newInstance();
...
}
}
|
Nach dem Login kopieren
Fazit
Durch die Nutzung der Fähigkeiten von JavaCompiler ist dies der Fall Es ist möglich, Java-Klassen dynamisch aus externen Quellen zu kompilieren und zu laden. Dieser Ansatz bietet eine flexible und anpassbare Lösung für Situationen, in denen Laufzeitverlängerungen erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie kann ich externe Java-Klassen zur Laufzeit dynamisch kompilieren und laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!