6

我基本上想去:

ScriptObjectMirror myObj = new ConcreteScriptObjectMirror();

然后像这样调用一些JS,myObj参数在哪里:

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

我现在正在这样做,但 Nashorn 抱怨说:

TypeError:无法将“with”应用于非脚本对象

所以我传入的Java对象需要是ScriptObjectMirror的一个实例。

4

3 回答 3

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 文档现在非常糟糕,所以我希望这可能会有所帮助。

于 2014-09-25T04:04:24.807 回答
1

由于 ScriptObjectMirror 是最终的,因此您不能从此类扩展。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/

于 2014-08-13T15:58:05.483 回答
0

我现在没有时间对此进行测试,但是在将 myObj 传递给 Nashorn 引擎时,请尝试使用 Java.from(foo)。

因此,在您的示例中,您可以执行以下操作:

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

当这是您的 JavaScript 对象的包装器时,您可能正在传递一个 Java 对象 (ScriptObjectMirror),调用 Java.from() 将为您解包它。

这里有一些解释: https : //wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions(搜索java.from)

于 2015-09-03T14:02:04.297 回答