Nashorn是否返回原生JavaScript对象?

时间:2013-06-24 01:46:08

标签: java nashorn

我目前正在使用Rhino的javax实现。默认情况下,Rhino使用包装器来返回Java对象。 Nashorn是否有类似的行为,或者它默认返回JavaScript对象?

由于

2 个答案:

答案 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