首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nashorn返回原生JavaScript对象吗?

Nashorn返回原生JavaScript对象吗?
EN

Stack Overflow用户
提问于 2013-06-24 09:46:08
回答 2查看 2.4K关注 0票数 4

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-24 12:35:06

看起来它尽了最大努力返回合理的对象。使用此代码,然后更改XXX:

代码语言:javascript
复制
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());

收益率:

代码语言:javascript
复制
return 'hello world' = java.lang.String
return 1 = java.lang.Integer
return { name: 'Hello' } = jdk.nashorn.api.scripting.ScriptObjectMirror
票数 4
EN

Stack Overflow用户

发布于 2013-08-26 22:52:50

看起来,即使Java对象可以在JS代码中使用,它仍然引用Java对象(尽管它们显示为函数对象,因此必须有一个包装器),但我们不能将它们视为Javascript对象:

代码语言: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);

结果如下:

代码语言:javascript
复制
testObj.js:9 TypeError: Cannot set property "name" of undefined

现在,Javascript对象将作为"jdk.nashorn.internal.scripts.JO“实例加载。

*如果你想更容易地测试上面的代码,只需为你的JDK的jjs (Nashorn解释器)创建一个别名,例如,如果你创建了一个名为test.js的文件,你可以用以下命令运行程序:

代码语言:javascript
复制
$ jjs test.js

Mac OS = alias jjs=’/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/jjs’

Windows =定义一个名为‘JAVA8_HOME’的环境变量,并指向您的jdk8文件夹,然后可以通过运行以下命令来调用jjs:

代码语言:javascript
复制
> “%JAVA8_HOME%\jre\bin\jjs” test.js
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17267017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档