问题标签 [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.
java - Nashorn 的 Object.bindProperties() 方法
我对 Nashorn 中的 Object.bindProperties() 方法有两个问题:
- 除了https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal之外,是否有此方法的综合文档?
- 是不是如下图的bug?
以下代码没有将 obj2 的 x、y 和 z 属性绑定到 obj,因为 obj 已经具有同名的属性。它是否记录在某处?
现在,让我们为 obj2 添加一个新属性。新属性绑定到 obj,但 obj 将新属性的值读取为 null:
而且,这是另一个有效的代码变体。这一次,我将目标对象设为空。现在,将新属性添加到源代码可以正常工作。
我正在使用 JDK 版本 1.8.0_20。
谢谢木尻
java - 在 Java 中使用 Nashorn?
我正在阅读有关 Java 8 新功能的信息,并了解到它带有 Nashorn(Javascript 引擎)。有人可以解释我为什么/应该在 Java 中使用 Javascript 引擎。它会解决什么编程问题?任何例子
谢谢,拉维
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 进行了测试。
java - Java 8 Nashorn - 将 engine.eval("print('hello world')) 捕获到 String 对象中?
有没有办法在 Nashorn 中捕获 print('hello world') 的结果并将其放置在 String 对象中。
我试过这个:
当引擎评估这个javascript时,它只是打印到标准输出,所以我想我只是将标准输出重定向到我自己的OutputStream,然后将它转换为字符串,但它不起作用。
有什么想法吗?
java - Nashorn NullPointerException 与 SecurityManager
我正在使用 nashorn js 解释器创建一个沙盒程序,并使用一个极简的安全管理器来限制它可以做什么。
问题是当我打电话时engine.eval(reader)
我得到一个空指针异常。
我知道阅读器可以工作,因为我能够逐字打印整个文件。我知道这是一个权限问题,因为如果我添加 AllPermissions 那么一切正常。
那么我需要什么权限才能在 nashorn 中运行脚本?
显然我搞砸了我的初始测试,不仅仅是文件阅读器,当我对字符串进行硬编码时也会发生这种情况。
java - 阅读 Nashorn JO4 和 NativeArray
Java调用代码:
Javascript:
目标:
对于每个 Map 值,我尝试过但失败了:
- 转换为 ScriptObject 或 ScriptObjectMirror
- 投射到地图或列表
- 直接访问 JO4/NativeArray 方法
- ScriptUtils.wrap() / ScriptUtils.unwrap()
我尝试过覆盖该HashMap.put()
方法,但它似乎没有被转换为 a ScriptObjectMirror
on assignments,仅在显式函数调用上:
我真的需要使用 myCustomHashMap (它时间戳更改并维护更改列表等),所以我不能从根本上改变这种安排。我该怎么做才能恢复这些数据?
java - 使用 java javascript 脚本 API 操作 HTML 节点
我正在使用运行良好的Java Scripting API。现在我有一个函数,我想<a>
从字符串中获取所有标签,然后在返回操纵的字符串之前添加/删除属性。问题当然是,我不能只使用document.getElementsByTagName
. 是否有任何简单的选项可以在不经过 regex-hell 的情况下出现在您的脑海中?
请注意,我目前在 Java 7(使用 Rhino)上运行,计划更新到 Java 8(使用 Nashorn),所以我不想使用任何 Rhino 特定的 API。
java - 如何在 Oracle Nashorn 中覆盖和调用 Java 对象上的函数?
我有一个 Java 对象,它需要由一些 Java 代码初始化。然后这个对象将被放入 nashorn 引擎中。将调用一些 JavaScript 代码,这些代码应覆盖此对象上的方法。稍后在 Java 中应该调用被覆盖的方法。
此代码不起作用:
首先:方法“test”没有被覆盖->调用它返回“3”。第二:调用原始“test”方法失败,出现异常“getInterface cannot be called on non-script object”
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 版本大致一样快(作为构建过程中的一个单独且复杂的步骤)。也许这是尽可能快的?
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 吗?