2014-03-31 4 views
1

저는 rhino를 사용하여 일부 응용 프로그램을 사용자 정의 할 수있었습니다. 다음은 자바에서 호출되는 자바 스크립트 함수의 예입니다 : 다음은 할 필요가 무엇 이건 반환 된 객체의 값을 얻을 수 있습니다자바 스크립트 객체의 필드 값 받기

 function() { 
      var phone = this.telephoneNumber; 
      phone = phone.replace(/[^+0-9]/g,""); 
      if (phone.indexOf("+") == 0) { 
       phone = "00" + phone.substring(1); 
      } 
      if (phone.indexOf("0041") == 0) { 
       phone = "0" + phone.substring(4); 
      } 
      if (phone.indexOf("0") == 0) { 
       phone = "0" + phone; 
      } 
      return { 
       Name: this.sn + " " + this.givenName, 
       firstName: this.givenName || "", 
       lastName: this.sn || "", 
       phone: phone, 
       service: "", 
       info: "" 
      }; 
     } 

자바 응용 프로그램입니다.

rhino가 JVM의 일부이므로 Rhino API 대신 스크립팅 API를 사용하고 싶습니다. 그러나 Java 코드에서 JavaScript 개체의 필드 값을 가져 오는 방법을 찾지 못했습니다.

+0

Rhino는 JVM의 일부가 아닙니다. 그것은 런타임의 일부입니다. Java가 XSLT 용 Xalan의 패치 버전을 사용하는 것과 같습니다. 런타임시 Rhino의 버전을 크게 최적화하지 않고 최적화를 Rhino에 다시 적용하지 않으면 성능이 크게 향상되지 않습니다. 또한 Rhino의 구버전을 사용하고 있습니다. –

+0

@DavidEhrmann 예, 성능 향상을 얻는 것이 아니라 표준 스크립트 엔진 API를 사용하여 다른 스크립트 언어로 전환하는 것이 더 쉽습니다. –

답변

1

이것은 스크립트 언어와 느슨하게 연결되지만 함수의 이름을 지정해야한다는 경고와 함께 반환 된 객체는 Map이어야합니다 (Rhino는 이것을 처리하지만 JRuby에 대해서는 잘 모르겠습니다).

ScriptEngineManager factory = new ScriptEngineManager(); 
    ScriptEngine engine = factory.getEngineByName("JavaScript"); 
    engine.eval("function x() { return { foo: 10 } }"); 

    Object o = ((Invocable)engine).invokeFunction("x"); 
    if (o instanceof Map) { 
    Map m = (Map<Object, Object>)o; 
     System.out.println(m.get("foo")); 
    } 

또는

CompiledScript script = ((Compilable)engine).compile("(function() { return {bar:20} })()"); 
    System.err.println(((Map)script.eval()).get("bar")); 

는하지만 당신은 속임수와 (...)()으로 패딩하여 함수를 호출해야합니다.

+1

충분합니다. 그것은 1.7 이상에서만 작동합니다 ... 이전 버전 지원을 중단 할 때가 된 것 같습니다 ... 웃기는 세부 사항 : 1.7은 1.8을 반환하지만 1.8은 정수를 반환합니다. –

+0

적절한 JSR JAR을 찾으면 Java 6에서 실행할 수 있습니다. 나는 StAX와 Java 5로 그렇게해야한다는 것을 기억한다. Javascript 숫자는 기술적으로 모두 복식이므로 의미가 있다고 가정합니다. check를 입력하면 Number, intValue()를 사용해야합니다. –

+0

글쎄, 객체가 Map이 아니라는 점을 제외하면 java 6에서 작동합니다. –