1

我在使用 nashorn 时遇到问题,我不太了解原生构造函数的工作原理(对象、数组等)。

我的问题涉及应用程序生命周期中的多个 ScriptEngine,其中一些可以创建函数。

我尝试在新的 ScriptEngines 中使用这些函数,问题是我无法检查对象是否属于给定类型(array instanceof Array),因为该 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                                                                                                                                             

}

你知道如何让它工作吗?

4

1 回答 1

2

每个引擎的 ENGINE_SCOPE 绑定都与一个 Nashorn 全局范围对象相关联。“Array”、“Object”等是定义在全局范围内的 JS 内置构造函数。所以这样的构造函数在不同的全局范围内是不同的。因此,您不能将来自另一个全局范围的对象与“instanceof”进行比较。但是由于基于智能 dynalink 的链接,nashorn 仍然可以允许您访问此类“跨全局”对象的属性。例如,您可以使用正常的属性/元素访问、方法调用语法访问“长度”属性、脚本中的数组元素在另一个引擎中运行。希望这可以帮助。

于 2014-09-12T12:26:32.107 回答