2011-04-08 9 views
1

이것은 this other SO question about arrays과 매우 유사합니다.JSR223을 통한 Rhino와 Java의 상호 운용 : 자바 스크립트 객체 인스턴스와의 작업

내가 평가하는 경우

JSR223 (ScriptingEngine)를 통해 인스턴스 자바 스크립트 스크립트
y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"} 

, 나는 어떤 종류의 (I 이클립스의 디버거에서이 참조)의 NativeObject을 얻는 방법의 속성에 액세스하는 아무 생각이 없다 . 또한, 어떤 .jar 파일 (있는 경우)을 빌드 경로에 추가하여 문제의 클래스에서 작업 할 수 있는지조차 모르며 Rhino Javascript에서 작동하는 접근 방식을 찾으면 유용하지 않습니다. 자이 썬.

JSR223과 같이 보이는 것은 ScriptingEngine에 언어에 구애받지 않는 액세스 방법을 포함 시켜서 배열의 경우 List<Object> 또는 연관 배열의 경우 Map<String, Object>으로 반환 된 객체를 래핑하는 기능을 제공해야합니다.

제안 사항?

+0

당신은 자바 객체에 액세스하는 방법에 코뿔소 문서는 확인 했되어 다음? http://www.mozilla.org/rhino/ScriptingJava.html – eee

+0

네,하지만 Javascript에서 자바 객체에 액세스하는 방법에 초점을 맞추고 있습니다. 내가 원하는 것은 그 반대입니다 : Java에서 Javascript 객체에 액세스하십시오. 또한 Rhino의 js.jar를 실제로 사용하지 않기 때문에 혼란 스럽습니다. SE 6 배포본의 일부인 javax.script 클래스를 사용하고 있으므로 sun.org.mozilla. *를 어떻게 가져올 지 모릅니다. 내 빌드 경로 또는 내가 그렇게해야하는지 여부. –

+0

Java 배열을 자바 스크립트 배열 모드로보기 : http://www.mozilla.org/rhino/faq.html – eee

답변

0

다른 스크립팅 언어를 jsr223 또는 bsf보다 많은 기능으로 포함하려고합니다. 이를 위해 필자는 자체 인터페이스를 정의하고 각기 다른 스크립팅 엔진을 구현해야했습니다.

필자가 원했던 기능 중 하나는 함수 (단일 메서드로 자바 인터페이스)를 내 스크립팅 엔진에 전달하고 매개 변수를 전달할 때만 작동시키는 기능이었습니다. 각 임베디드 스크립팅 엔진에는 스크립팅 환경에서 Java 값을 랩핑하거나 언 랩핑하는 레이어가 있습니다.

나는이 문제를 해결하는 가장 좋은 방법은 스크립팅 엔진을 감싸는 래퍼가 getValue (String name)을 제공하고 javascript 배열을 자바 목록으로 변환하는 것을 수정하는 것입니다. 당연히 setValue (String, Object)는 값이 List인지 확인한 다음 js 배열로 다시 변환합니다. 그 지루한 :()

0

자바 개체로 변환하고 그것을 반환합니다. 그런 다음 평소와 같이 Java 객체로 작업 할 수 있습니다.

예를 들어 변환 기능

function convertToJava(o) { 
    var rval; 
    if (Array.isArray(o)) { 
     rval = new java.util.ArrayList(); 
     for (var key in o) { 
      rval.add(convertToJava(o[key])); 
     } 
    } 
    else if (typeof o === 'object') { 
     rval = new java.util.HashMap(); 
     for (var key in o) { 
      rval.put(key, convertToJava(o[key])); 
     } 
    } 
    else if (typeof o === 'function') { 
     // skip 
    } 
    else if (typeof o === 'undefined') { 
     // skip 
    } 
    else { 
     rval = o; 
    } 
    return rval; 
}