Ich habe in meiner Anwendung seit einiger Zeit dynamischen Code über JSR-223 ausgeführt. Die grundlegende Logik ist:Ausführen von dynamischem Java-Code über JSR-223
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(engineName);
final CompiledScript compiled = ((Compilable) scriptEngine).compile(script);
Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("key", value);
compiled.eval(bindings);
Dies funktioniert hervorragend für Nashorn und Groovy Skript-Engines. Es wäre jedoch großartig, wenn es bei der Erweiterung der Logik der Anwendung nicht erforderlich wäre, die Syntax und die Tricks einer anderen Sprache zu kennen - der Basiscode ist schließlich in Java.
Bei der Auflistung der Einbaumotoren gibt keine solche vorhanden für Java zu sein scheinen:
ScriptEngineManager manager = new ScriptEngineManager();
List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
for (ScriptEngineFactory factory : factoryList) {
log.debug(factory.getLanguageName());
}
Ich habe ein paar dynamische Java-Bibliotheken gefunden, aber sie scheinen nicht mehr gehalten werden. Ich denke, es ist möglich, etwas zusammen mit der javax.tools.JavaCompiler
zu schreiben, aber ich hoffe, dass ich etwas Grundlegendes vermisse und es gibt Arbeitsmöglichkeiten für so etwas, das bereits existiert. Ich bin mir auch der Grundlagen von jshell in Java 9 bewusst, aber ich habe noch nichts darüber gehört, dass Code mit dem ScriptEngineManager ausgeführt werden kann.
Wie sollte ich die Skripterstellung mithilfe der Java-Sprache selbst implementieren? Gibt es irgendwelche Optionen darüber hinaus, meine eigene javax.script.ScriptEngine
mit Hilfe von javax.tools.JavaCompiler
zu implementieren?
Sie wollen also eine Java-Skript-Engine, die in der JVM ausgeführt wird? Klingt nicht besonders effizient. Um dynamischen Code aus Text zu generieren, macht JavaCompiler den Trick – efekctive