我目前正在使用Rhino的javax实现。默认情况下,Rhino使用包装器来返回Java对象。 Nashorn是否有类似的行为,或者它默认返回JavaScript对象?
由于
答案 0 :(得分:4)
看起来它会尽力返回合理的物体。使用此代码,然后更改XXX:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("nashorn");
engine.eval("function test() { return XXX; };");
Object result = ((Invocable)engine).invokeFunction("test");
System.out.println(result.getClass().getName());
收率:
return 'hello world' = java.lang.String
return 1 = java.lang.Integer
return { name: 'Hello' } = jdk.nashorn.api.scripting.ScriptObjectMirror
答案 1 :(得分:1)
看起来,即使Java对象可以在JS代码中使用,它仍然引用Java对象(虽然它们显示为函数对象,因此必须有一个包装器),我们不能将它们视为Javascript对象:
//"import"
var StringTokenizer = java.util.StringTokenizer;
print(typeof StringTokenizer);
var st = new StringTokenizer("this is a test");
print(typeof st);
java.util.StringTokenizer.prototype.name = 'myST';
print(st.name);
这是结果:
testObj.js:9 TypeError: Cannot set property "name" of undefined
现在Javascript对象将作为“jdk.nashorn.internal.scripts.JO”实例加载。
*如果您想更轻松地测试上述代码,只需为JDK的jjs
(Nashorn Interpreter)创建一个别名,例如,如果您创建一个名为test.js
的文件,则可以运行程序:
$ jjs test.js
Mac OS = alias jjs=’/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/jjs’
Windows =定义一个名为“JAVA8_HOME”的环境变量并指向您的jdk8文件夹,然后您可以通过运行此命令来调用jjs:
> “%JAVA8_HOME%\jre\bin\jjs” test.js