2014-09-08 2 views
0

Nashorn에 문제가있어서 기본 생성자 (Object, Array 등)의 작동 방식을 알 수 없습니다.여러 Nashorn ScriptEngine 사이에서 JavaScript 배열 및 객체 공유

내 문제는 응용 프로그램의 수명주기 동안 여러 ScriptEngines가 관련되어 있으며 그 중 일부는 기능을 만들 수 있습니다.

새로운 ScriptEngine에서 이러한 함수를 사용하려고하면 배열이이 인스턴스의 Array 생성자에 의해 생성되지 않았기 때문에 객체가 지정된 유형 (배열 instanceof Array)인지 확인할 수 없다는 문제가 있습니다. 이 글 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 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                                    

} 

가없는 : 여기

그것을 복제하는 테스트입니다 어떻게 작동 시키는가?

답변

2

각 엔진의 ENGINE_SCOPE 바인딩은 Nashorn Global 범위 개체와 연결됩니다. "Array", "Object"등은 전역 범위에서 정의 된 JS 내장 생성자입니다. 따라서 이러한 생성자는 서로 다른 전역 범위에서 서로 다릅니다. 따라서 다른 전역 범위의 개체를 "instanceof"와 비교할 수 없습니다. 하지만 스마트 dynalink 기반 연결 때문에 nashorn은 여전히 ​​"크로스 글로벌"객체의 속성에 액세스 할 수 있습니다. 예를 들어 일반적인 속성/요소 액세스, 메서드 호출 구문을 사용하여 다른 엔진에서 실행되는 스크립트에서 배열의 요소 인 "length"속성에 액세스 할 수 있습니다. 희망이 도움이됩니다.