代码之家  ›  专栏  ›  技术社区  ›  Tarmo

在JSR-223上执行动态Java代码

  •  2
  • Tarmo  · 技术社区  · 8 年前

    我已经在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);
    

    这对于Nashorn和Groovy脚本引擎非常有效。然而,如果扩展应用程序的逻辑不需要了解另一种语言的语法和技巧,那就太好了——毕竟基础代码是Java的。

    ScriptEngineManager manager = new ScriptEngineManager();
    List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
    for (ScriptEngineFactory factory : factoryList) {
        log.debug(factory.getLanguageName());
    }
    

    我发现了一些动态Java库,但它们似乎不再被维护。我想可以使用 javax.tools.JavaCompiler 但我希望,也许我错过了一些基本的东西,对于这样一个已经存在的东西,有工作的选择。我还了解Java 9中jshell的基本知识,但我没有听说过任何关于它允许使用ScriptEngineManager执行代码的内容。

    javax.script.ScriptEngine 借助于 javax.tools.JavaCompiler

    3 回复  |  直到 8 年前
        1
  •  2
  •   Eric Obermühlner    6 年前

    我有点晚了,但我刚刚发布了jshell脚本引擎的1.1.0版本。

    看看: https://github.com/eobermuhlner/jshell-scriptengine

        3
  •  0
  •   A. Sundararajan    8 年前

    你看到了吗 JShell tool API