2009-10-16 4 views
2

이 프로젝트에서 Rhino 과 함께 javax.scripting을 사용하고 있습니다.Rhino Javascript : Object를 Javascript 프리미티브로 변환하는 방법은 무엇입니까?

Java 개체 (Double, Long, 정수 등)를 반환하는 Java 메서드가 있습니다. 그 메소드를 자바 스크립트에서 호출하고 자바 스크립트 프리미티브 유형으로 결과를 참조하고 싶습니다. 그러나 javacript는 반환 유형을 Object로 인식합니다.

어떻게 자바 스크립트 프리미티브로 변환합니까?

이 질문은 내가 컨텍스트와 WrapFactory에 대한 참조를 어떻게받을 수 있나요되어 http://groups.google.com/group/mozilla.dev.tech.js-engine.rhino/browse_thread/thread/2f3d43bb49d5288a/dde79e1aa72e1301

그의 문제와 매우 유사하다?

샘플 코드 :

public class data 
{ 
    Double value = 1.0d; 
    public Number get() { return value; } 
} 


    public static void main(String[] args) 
    { 
      ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
      data data = new data(); 
      try 
      { 
        engine.eval("function test(data) { return data.getD('value1') + 5;};"); 
        System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
      } 
      catch (Exception e) 
      { 
        e.printStackTrace(); 
      } 
    } 

출력 : 결과 : 15

답변

3

명시 적으로 값을 캐스팅 당신이 자바 스크립트 함수를 수정할 수 있습니다, 다음

public static void main(String [] args) throws Exception { 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
     data data = new data(); 
     Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); 

     try 
     { 
       engine.eval("function test(data) { return data.get('value1') + 5;};"); 
       System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
     } 
     catch (Exception e) 
     { 
       e.printStackTrace(); 
     } 
    } 

    public static class data 
    { 
     Double value = 1.0d; 
     public Number get(String arg) { return value; } 
    } 

또는 시도 번호 :

function test(data) { return parseInt(data.get('value1'), 10) + 5;} 
+0

이렇게하면 NullPointerException이 발생합니다. 컨텍스트.getCurrentContext()가 null입니다. – Tazzy531

+0

올바른 구현을 제공하도록 편집되었습니다. – Kevin

+0

효과가 없습니다. 아직도 얻을 : 결과 : 15 – Tazzy531

0

를 사용하여 자바 스크립트 코드의 출력으로 다음

function aFunction(data) 
{ 
    return parseInt(data); 
} 
0

난 당신이 자바 6에 내장 된 자바 스크립트 엔진에 의해 평가됩니다 수학 공식의 집합을 입력이 응용 프로그램을 개발하는 I 믿음은 코뿔소입니다. 나는 식의 표현의 일부로서 그 접근 방식을 사용

MAP["VALUE 1"] 
MAP["VALUE 2"] 

내 통제하에 것을 있었다 변수에서 온 : 아이디어는 우리가지도의 집합을 가질 것이며,이지도는 다음과 같은 변수를 포함 할 것이라고했다 잘못된 JS 식별자 일 수 있습니다. 첫 번째 방법은지도를 선언하고 JS 엔진에 추가하는 것이지만 실패하는 것과 같은 방식으로 실패했습니다. 숫자로 해석되는 것이 아니라 문자열로 해석되었습니다.

해결 방법은 수식을 구문 분석하고 어떤 변수가 사용되고 있는지 파악한 다음 JS 엔진 내부에서 개체를 선언하는 것입니다. 이 같은

뭔가 :

var MAP = new Object(); 
MAP["VALUE 1"] = 1; 
MAP["VALUE 2"] = 2; 

그리고 MAP["VALUE 1"] + MAP["VALUE 2"]3를 반환, 그리고 12.

더 좋은 해결책이있을 수 있지만 초기 코딩/구문 분석을 수행하면 위의 내용이 항상 작동합니다. 여기에는 "선언적"문장을 실행하는 단계와 수식을 실행하는 단계가 있습니다. JS 엔진은 정말 빠릅니다. 그래서 우리에게는 문제가 아닙니다.

관련 문제