我遇到了nashorn的问题,我不太了解本机构造函数的工作方式(Object,Array等)。
我的问题涉及到应用程序生命周期中的几个ScriptEngine,其中一些可以创建函数。
我尝试在新的ScriptEngines中使用这些函数,问题是我无法检查对象是否属于给定类型(数组instanceof Array),因为该数组不是由此实例的Array构造函数生成的。
这是一个复制它的测试:
def "Just testing"() {
when:
def manager = new ScriptEngineManager()
def engine1 = manager.getEngineByName("nashorn")
def engine2 = manager.getEngineByName("nashorn")
def arrImpl = engine1.eval("[]")
engine2.context.setAttribute("arr", arrImpl, ScriptContext.ENGINE_SCOPE)
def val = engine2.eval("arr instanceof Array")
then:
val == true
}
我读过这篇文章https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes并试图像这样解决它,但仍然没有运气
def "Just testing"() {
when:
def manager = new ScriptEngineManager()
def engine1 = manager.getEngineByName("nashorn")
def engine2 = manager.getEngineByName("nashorn")
def context = new SimpleScriptContext()
def bindings = engine1.getContext().getBindings(ScriptContext.ENGINE_SCOPE)
context.setBindings(bindings, ScriptContext.ENGINE_SCOPE)
def arrImpl = engine1.eval("[]")
context.setAttribute("arr", arrImpl, ScriptContext.ENGINE_SCOPE)
def val = engine2.eval("arr instanceof Array", context)
then:
val == true
}
你知道如何让它发挥作用吗?
答案 0 :(得分:2)
每个引擎的ENGINE_SCOPE绑定都与Nashorn全局范围对象相关联。 “Array”,“Object”等是在全局范围内定义的JS内置构造函数。所以这样的构造函数在不同的全局范围内是不同的。因此,您无法将来自另一个全局范围的对象与“instanceof”进行比较。但是由于基于智能dynalink的链接,nashorn仍然可以允许您访问这种“跨全局”对象的属性。例如,您可以使用常规属性/元素访问,方法调用语法来访问另一个引擎中运行的脚本中的“length”属性,数组元素。希望这会有所帮助。