Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个nashorn脚本引擎之间共享JavaScript数组和对象_Java_Javascript_Nashorn - Fatal编程技术网

在多个nashorn脚本引擎之间共享JavaScript数组和对象

在多个nashorn脚本引擎之间共享JavaScript数组和对象,java,javascript,nashorn,Java,Javascript,Nashorn,我对nashorn有一个问题,我不太了解本机构造函数是如何工作的(对象、数组等) 我的问题涉及应用程序生命周期中的几个脚本引擎,其中一些可以创建函数 我尝试在新的脚本引擎中使用这些函数,问题是我无法检查对象是否属于给定类型(array instanceof array),因为该数组不是由该实例的数组构造函数生成的 下面是一个复制它的测试: def "Just testing"() {

我对nashorn有一个问题,我不太了解本机构造函数是如何工作的(对象、数组等)

我的问题涉及应用程序生命周期中的几个脚本引擎,其中一些可以创建函数

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

}
我读了这篇文章,并试图这样解决它,但仍然没有运气

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                                                                                                                                             

}

您知道如何使其工作吗?

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