我目前使用的是Rhino的javax实现。默认情况下,Rhino使用包装器返回Java对象。Nashorn是否有类似的行为,或者它是否默认返回JavaScript对象?
谢谢
发布于 2013-06-24 12:35:06
看起来它尽了最大努力返回合理的对象。使用此代码,然后更改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发布于 2013-08-26 22:52:50
看起来,即使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解释器)创建一个别名,例如,如果你创建了一个名为test.js的文件,你可以用以下命令运行程序:
$ jjs test.jsMac 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.jshttps://stackoverflow.com/questions/17267017
复制相似问题