2014-07-11 50 views
6

我基本上想要去:在Java中有Nashorn的ScriptObjectMirror的公共和具體實例嗎?

ScriptObjectMirror myObj = new ConcreteScriptObjectMirror(); 

,然後調用一些JS這樣,在myObj是參數:

function myJSFunc(param) { 
    with(param) { 
     return paramProperty; 
    } 
} 

我這樣做了,但犀牛抱怨:

TypeError: Cannot apply "with" to non script object

所以我傳入的Java對象需要是ScriptObjectMirror的一個實例。

回答

0

因爲ScriptObjectMirror是final的,所以不能從這個類繼承。 Nashorn引擎使用ScriptObjectMirror將JavaScript對象傳遞給Java端,而不是相反。

當調用從Java代碼中的JavaScript功能你可以通過任意的Java對象的功能:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
engine.eval(new FileReader("myScript.js")); 

Invocable invocable = (Invocable) engine; 

Object result = invocable.invokeFunction("myJSFunc", "Peter Parker"); 
System.out.println(result); 

請參閱本文的例子:http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/

+0

犀牛不會接受在JS「與」任意的Java對象,雖然。因此我的問題。 – Kong

3

我有同樣的問題,只是在如果你還沒有找到答案。我認爲下面的代碼片段可能包含你想要的。我使用javax.script.SimpleBindings將對象傳遞給JavaScript函數。

import javax.script.Compilable; 
import javax.script.CompiledScript; 
import javax.script.Invocable; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 
import javax.script.SimpleBindings; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Demo demo = new Demo(); 
     String result = demo.execute(); 
     System.out.println("full name is " + result); 
    } 

    public String execute() throws ScriptException, NoSuchMethodException { 
     final ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
     final Compilable compilable = (Compilable) engine; 
     final Invocable invocable = (Invocable) engine; 

     final String statement = "function fetch(values) { return values['first_name'] + ' ' + values['last_name']; };"; 
     final CompiledScript compiled = compilable.compile(statement); 

     compiled.eval(); 

     SimpleBindings test = new SimpleBindings(); 
     test.put("first_name", "John"); 
     test.put("last_name", "Doe"); 

     FullName fullName = invocable.getInterface(FullName.class); 
     return fullName.fetch(test); 
    } 

    public interface FullName { 
     String fetch(SimpleBindings values); 
    } 
} 

恕我直言,Nashorn文檔現在相當糟糕,所以我希望這可能會有所幫助。

0

我現在還沒有時間來測試它,但是在您將myObj傳遞到Nashorn引擎時,請嘗試使用Java.from(foo)。

所以,在你的榜樣,你可能能夠做到:

function myJSFunc(param) { 
    with(Java.from(param)) { 
     return paramProperty; 
    } 
} 

這可能是要傳遞一個Java對象(ScriptObjectMirror)時,這是你的JavaScript對象的包裝,調用Java的情況。 from()將爲你解開這個。

一些解釋這裏: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions(搜索java.from)

相關問題