10

ユーザーが入力したスクリプトの小さなスニペットを実行するために、JSR 223 経由で Nashorn を使用しています。

public Invocable buildInvocable(String script) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName(ENGINE);
    engine.eval(functions);
    engine.eval(script);
    return (Invocable) engine;
}

functionsさまざまなユーザー スクリプトは、静的な中央ライブラリ (上記のコード スニペットの文字列に保持されている) で定義されている JavaScript 関数を呼び出します。

Java から呼び出すことができるを取得するたびにInvocable、大きなライブラリ コードを常に再コンパイルする必要があります。

以前にコンパイルしたコードを新しいコードに結合する方法はありますか?

4

3 に答える 3

18

コンパイルされた関数を次のようにバインディングに入れます。

private static final String FUNCTIONS =
    "function() {" +
    "  return \"Hello\";" +
    "}";

public static void main(String... args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByMimeType("text/javascript");

    // Compile common functions once
    CompiledScript compiled = ((Compilable) engine).compile(FUNCTIONS);
    Object sayHello = compiled.eval();

    // Load users' script each time
    SimpleBindings global = new SimpleBindings();
    global.put("sayHello", sayHello);
    String script = "sayHello()";
    System.out.println(engine.eval(script, global));
}
于 2014-11-27T11:55:57.980 に答える