允许Java';s ScriptEngineManager来访问某些Java方法

允许Java';s ScriptEngineManager来访问某些Java方法,java,Java,是否可以从ScriptEngineManager内部访问Java方法 我发现了如何使用Invocable invoke函数方法,但现在我需要相反的方法 public class Main {   public static void main (String[] args) throws Exception {     String source = "var results = system.foo('example');            \n" +

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

我发现了如何使用Invocable invoke函数方法,但现在我需要相反的方法

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中的方法。

这样做更容易。假设您想向脚本公开
系统。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库中的函数类来公开各个Java方法,它们以类似的方式将其公开给您的脚本。

如果您正在寻找JavaScript引擎,我将使用Rhino的最新版本。随JRE打包的版本很旧。我需要能够指定它们可以访问哪些类。那么这是否意味着并非所有方法都将公开?您可以公开一个对象,也可以通过在Rhino库中实现函数对象来包装一个方法。