Für echten Java-Code ist dies möglich mit JavaCompiler
Schnittstelle. Es ist jedoch sehr umständlich zu verwenden, da es nur eine Schnittstelle zu einem echten Java-Compiler ist, der erwartet, dass komplette Klassendefinitionen in Dateien kompiliert werden.
Die einfachste Möglichkeit zur Ausführung von Code, der zur Laufzeit bereitgestellt wird, ist die Rhino JavaScript Engine .
Diese beiden Optionen waren nur in Java 6 enthalten, obwohl ich glaube, dass die Skriptschnittstelle bereits existierte. Daher könnten Sie Rhino in einer früheren JRE verwenden, wenn Sie es herunterladen und zum Klassenpfad hinzufügen.
Sie müssten eine Bytecode-Manipulationsbibliothek verwenden, z. B. Javaassist ( Wikipedia ), um eine beliebige Zeichenfolge auszuführen, die zur Laufzeit bereitgestellt wird. Mit JavaSist können Sie CtClass
basierend auf einer Zeichenfolge erstellen, die den Quellcode darstellt. und kann dies dann in kompiliertes Class
-Objekt über einen bestimmten Klassenlader verwandeln, so dass die Klasse dann für Ihre Anwendung verfügbar ist. Andere Bibliotheken müssten etwas Ähnliches wie diese beiden Schritte tun, um dasselbe zu erreichen.
Es ist also möglich, aber es ist sehr schwer und macht Ihre Bewerbung wahrscheinlich sehr schwierig. Wenn es überhaupt möglich ist, sollten Sie eine sehr flexible Klasse statisch entwerfen und Parameter akzeptieren, die ihr Verhalten steuern.
Wenn Sie mehr als nur eine vorhandene Methode dynamisch aufrufen möchten, müssen Sie möglicherweise Ihre Zeichenfolge in Bytecode kompilieren. Eine einfache Möglichkeit besteht darin, den Eclipse / JDT-Compiler jar in Ihren Klassenpfad einzufügen, und Sie können diesen dann verwenden, um Ihren String in eine Klasse zu kompilieren, die dann geladen werden kann.
Diese Art der dynamischen Codegenerierung und -ausführung wird zum Konvertieren von JSP-Dateien in Servlets verwendet und in anderen Paketen wie JasperReports verwendet, um eine Berichtsspezifikation in eine Klasse umzuwandeln, die dann aufgerufen wird.
Denken Sie daran, dass Sie genau wie SQL vorsichtig sein müssen, um Code-Injection-Sicherheitsprobleme zu verhindern, wenn einer der String benutzerdefinierte Daten enthält.
Schauen Sie sich Beanshell an. Es bietet einen Interpreter mit Java-ähnlicher Syntax.
Ja, das ist möglich. Sehen Sie sich die Java-Compiler-API an. Schau mal hier:
Tags und Links java