2011-08-28 30 views
0

是否可以从ScriptEngineManager中访问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" + 
        "                                                \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中的方法。

+0

如果您正在寻找JavaScript引擎,我会使用最新版本的Rhino。与JRE一起打包的版本是旧的。 – babsher

+0

我需要能够指定他们可以访问哪些类。 – Mark

回答

0

使用Mozilla Rhino这样做更容易。说你想揭露System.out到脚本:

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

然后:

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

您还可以通过在犀牛库扩展功能类暴露个人Java方法和他们暴露在你的脚本以类似的方式。

+0

那么这是否意味着并非所有的方法都会暴露? – Mark

+0

您可以公开一个对象,也可以通过在Rhino库中实现Function对象来包装一个方法。 – babsher