2011-08-28 48 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