允许Java的ScriptEngineManager访问某些Java方法

时间:2011-08-28 01:52:32

标签: java

是否可以从ScriptEngineManager内部访问Java方法。

我发现了如何使用Invocable调用函数方法,但现在我需要相反的事情发生。

public class Main {
  public static void main (String[] args) throws Exception {
    String source = "var results = system.foo('example');            \n" +
                    "                                                \n" +
                    "if(results == \"hello\") {                      \n" +
                    "  print(\"ding dong.\");                        \n" +
                    "}                                               \n";
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
    engine.eval(source);
  }
}

public class System {
  public static String foo (String x) throws Exception {
    // do something with x
    return("hello");
  }
}

因此,当我运行system.foo时,它应该在System.foo中运行该方法。

1 个答案:

答案 0 :(得分:0)

使用Mozilla Rhino执行此操作要容易得多。假设您希望将System.out公开给您的脚本:

Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
Object wrappedOut = Context.javaToJS(System.out, scope);
ScriptableObject.putProperty(scope, "out", wrappedOut);

然后在JavaScript中:

var hello = "Hello World";
out.println(hello);

您还可以通过扩展Rhino库中的Function类来公开单个Java方法,并以类似的方式将它公开给您的脚本。