我基本上想要去:
ScriptObjectMirror myObj = new ConcreteScriptObjectMirror();
然后像这样调用一些JS,其中myObj
是参数:
function myJSFunc(param) {
with(param) {
return paramProperty;
}
}
我现在正在这样做,但Nashorn抱怨道:
TypeError:无法将“with”应用于非脚本对象
因此我传入的Java对象需要是ScriptObjectMirror的一个实例。
答案 0 :(得分: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的文档现在非常糟糕,所以我希望这可能会有所帮助。
答案 1 :(得分:1)
由于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/
答案 2 :(得分: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)