问题标签 [nashorn]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
961 浏览

java - Nashorn 的 Object.bindProperties() 方法

我对 Nashorn 中的 Object.bindProperties() 方法有两个问题:

  1. 除了https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal之外,是否有此方法的综合文档?
  2. 是不是如下图的bug?

以下代码没有将 obj2 的 x、y 和 z 属性绑定到 obj,因为 obj 已经具有同名的属性。它是否记录在某处?

现在,让我们为 obj2 添加一个新属性。新属性绑定到 obj,但 obj 将新属性的值读取为 null:

而且,这是另一个有效的代码变体。这一次,我将目标对象设为空。现在,将新属性添加到源代码可以正常工作。

我正在使用 JDK 版本 1.8.0_20。

谢谢木尻

0 投票
1 回答
343 浏览

java - 在 Java 中使用 Nashorn?

我正在阅读有关 Java 8 新功能的信息,并了解到它带有 Nashorn(Javascript 引擎)。有人可以解释我为什么/应该在 Java 中使用 Javascript 引擎。它会解决什么编程问题?任何例子

谢谢,拉维

0 投票
2 回答
1555 浏览

java - Nashorn 故障排除“方法代码太大!” 例外

在我的 JavaScript ( https://gist.github.com/also/005fd7c200b20f012e10 ) 上运行jjs或运行时会出现此异常并且没有更多详细信息:ScriptEngine#eval

如何找出导致方法代码太大的原因?我已经尝试了一些jjs( --log=codegen:info) 的日志选项,但我没有看到任何指向罪魁祸首的东西。

我已经使用 Java 版本 1.9.0-ea-b34 和 1.8.0_20-b26 进行了测试。

0 投票
3 回答
2627 浏览

java - Java 8 Nashorn - 将 engine.eval("print('hello world')) 捕获到 String 对象中?

有没有办法在 Nashorn 中捕获 print('hello world') 的结果并将其放置在 String 对象中。

我试过这个:

当引擎评估这个javascript时,它只是打印到标准输出,所以我想我只是将标准输出重定向到我自己的OutputStream,然后将它转换为字符串,但它不起作用。

有什么想法吗?

0 投票
2 回答
706 浏览

java - Nashorn NullPointerException 与 SecurityManager

我正在使用 nashorn js 解释器创建一个沙盒程序,并使用一个极简的安全管理器来限制它可以做什么。
问题是当我打电话时engine.eval(reader)我得到一个空指针异常。
我知道阅读器可以工作,因为我能够逐字打印整个文件。我知道这是一个权限问题,因为如果我添加 AllPermissions 那么一切正常。
那么我需要什么权限才能在 nashorn 中运行脚本?

显然我搞砸了我的初始测试,不仅仅是文件阅读器,当我对字符串进行硬编码时也会发生这种情况。

0 投票
1 回答
1692 浏览

java - 阅读 Nashorn JO4 和 NativeArray

Java调用代码:

Javascript:

目标:

对于每个 Map 值,我尝试过但失败了:

  • 转换为 ScriptObject 或 ScriptObjectMirror
  • 投射到地图或列表
  • 直接访问 JO4/NativeArray 方法
  • ScriptUtils.wrap() / ScriptUtils.unwrap()

我尝试过覆盖该HashMap.put()方法,但它似乎没有被转换为 a ScriptObjectMirroron assignments,仅在显式函数调用上:

我真的需要使用 myCustomHashMap (它时间戳更改并维护更改列表等),所以我不能从根本上改变这种安排。我该怎么做才能恢复这些数据?

0 投票
1 回答
426 浏览

java - 使用 java javascript 脚本 API 操作 HTML 节点

我正在使用运行良好的Java Scripting API。现在我有一个函数,我想<a>从字符串中获取所有标签,然后在返回操纵的字符串之前添加/删除属性。问题当然是,我不能只使用document.getElementsByTagName. 是否有任何简单的选项可以在不经过 regex-hell 的情况下出现在您的脑海中?

请注意,我目前在 Java 7(使用 Rhino)上运行,计划更新到 Java 8(使用 Nashorn),所以我不想使用任何 Rhino 特定的 API。

0 投票
1 回答
1399 浏览

java - 如何在 Oracle Nashorn 中覆盖和调用 Java 对象上的函数?

我有一个 Java 对象,它需要由一些 Java 代码初始化。然后这个对象将被放入 nashorn 引擎中。将调用一些 JavaScript 代码,这些代码应覆盖此对象上的方法。稍后在 Java 中应该调用被覆盖的方法。

此代码不起作用:

首先:方法“test”没有被覆盖->调用它返回“3”。第二:调用原始“test”方法失败,出现异常“getInterface cannot be called on non-script object”

0 投票
2 回答
11621 浏览

java - 如何让 Java 8 Nashorn 更快?

我正在使用 Java 8 Nashorn 将CommonMark呈现到 HTML 服务器端。如果我编译并缓存并重用 a CompiledScript,则某个页面需要 5 分钟才能呈现。但是,如果我改为使用eval, 并缓存和重用脚本引擎,渲染同一个页面需要 3 秒。

为什么CompiledScript这么慢?(示例代码如下)

在 Nashorn 中一遍又一遍地尽可能快地运行 Javascript 代码的好方法是什么?并避免多次编译 Javascript 代码?

这是服务器端 Scala 代码片段,它以需要 5 分钟的方式调用 Nashorn:(运行 200 次时;我正在将许多评论从 CommonMark 编译为 HTML。)(此代码基于此博客文章。)

编辑请注意,$script上述内容被重新评估了 200 次。我确实测试了一个只评估一次的版本,但显然我写了一些错误,因为唯一一次的版本不超过 5 分钟,虽然它应该是最快的版本之一,请参阅 Halfbit 的答案。这是快速版本:

/编辑

而这需要 2.7 秒:(运行 200 次时)

我实际上已经猜到CompiledScript版本(最上面的片段)会更快。无论如何,我想我必须缓存呈现的 HTML 服务器端。

(Linux Mint 17 和 Java 8 u20)

更新:

我只是注意到invokeFunction最后使用而不是eval几乎两倍快,只需要 1.7 秒。这与我使用 Rhino 编译为 Java 字节码的 Javascript 代码的 Java 7 版本大致一样快(作为构建过程中的一个单独且复杂的步骤)。也许这是尽可能快的?

0 投票
2 回答
1382 浏览

java - Java 将选择哪个 JS 脚本引擎?

ScriptEngineManager.getEngineByName 查找并为给定名称创建一个 ScriptEngine。

Rhino 将自己注册为“js”、“rhino”、“JavaScript”、“javascript”、“ECMAScript”和“ecmascript”

Nashorn 将自己注册为“nashorn”、“Nashorn”、“js”、“JS”、“JavaScript”、“javascript”、“ECMAScript”和“ecmascript”

如果我使用 Nashorn 和 Rhino 都注册的“js”之类的名称,将使用哪个脚本引擎?它会在 Java 8 和 Rhino 上使用 Nashorn 吗?