Gibt es eine Möglichkeit für ein laufendes Java-Programm, Java-Quellcode zu kompilieren (als String übergeben)?
%Vor%Idealerweise werden alle Klassen, auf die der übergebene Quellcode verweist, vom Klassenlader des Programms aufgelöst.
Gibt es so etwas?
Sicher. Werfen Sie einen Blick auf die JavaCompiler
Klasse und die anderen Klassen in das Paket javax.tools
.
Sie sind seit Java 1.6 da.
(Wie @Sergey Tachenov in den Kommentaren darauf hingewiesen hat, muss JDK als erforderliche tools.jar-Datei installiert sein, es kommt jedoch mit JDK, nicht mit JRE.)
Was Sie brauchen, ist eine Klasse, die JavaFileObject
erweitert %Vor%Welches kann wie folgt verwendet werden:
%Vor%Hängt davon ab, was Sie tun möchten. Wenn Sie nur etwas Code ausführen möchten, können Sie BeanShell verwenden. Es ist keine Java-kompilierte Klasse, aber es ist sehr nützlich, etwas flexibel zu machen
Du könntest meine essence jcf-Bibliothek ausprobieren, die das tut. Wenn Sie im Debug-Modus arbeiten, können Sie die Quelle in eine Datei schreiben lassen, so dass Sie in den Code einsteigen können. Ansonsten macht es alles im Speicher. Es umschließt den JavaCompiler in tools.jar
Er nimmt einen String, kompiliert und lädt ihn in den aktuellen Klassenlader und gibt die Klasse zurück. Es behandelt geschachtelte / innere Klassen.
Hinweis: Ich habe das nicht in OSGi funktioniert. ;)
Javassist kann zur Laufzeit Klassen und Methoden aus Strings des Quellcodes erzeugen und laden. Es ist auch möglich, die generierte Klasse bei Bedarf im Dateisystem abzulegen.
Gegenwärtig gibt es geringfügige Einschränkungen in dem Code, den Sie in diesen Zeichenfolgen übergeben können, z. B. Generics, Enumerationen oder Autoboxing und Posteingang von Primitiven können nicht enthalten sein. Mehr Informationen hier:
Tags und Links java compiler-construction