2012-07-14 2 views
1

A로 반환하기 전에 일부 객체를 변경하기 위해 rhino로 평가 된 javascript 함수 (B)를 사용해야하는 메소드 (A)가있는 자바 응용 프로그램이 있습니다. 요점은 A에서 B로 전달 된 매개 변수가 복소수 (List)이고 B의 반환 된 유형이 동일한 유형이어야한다는 것입니다. 현재 javascript 함수에서 내 자신의 클래스를 사용하는 방법을 모른다. 누구를 JavaScript로 가져올 수 있습니까?복잡한 객체를 매개 변수로 사용하여 Java 내에서 JavaScript-Function 호출

내 자바 스크립트 기능을로드하고 실행하려면 rhino how to call js function from java을 사용합니다.

미리 감사드립니다.

+0

무엇을 자바 스크립트로 가져 오나요? 자바 클래스? – MaVRoSCy

+0

@MaVRoSCy : 네, JavaScript로 제 자신의 클래스를 사용하고 싶습니다. JSON에 대한 직렬화는 내가 가진 한 가지 아이디어였다 ... – hans

답변

0

예제를 참조하십시오. jsr223을 사용하지만 아이디어를 얻을 수 있습니다. 나는 Rhino에 MyClass의 한 인스턴스를 가진리스트를 넘겨 주며, (자바 메소드 호출을 통해) 그것을 수정하고 마지막으로 또 다른 요소를 추가한다.

package lv.test; 

import java.util.ArrayList; 
import java.util.List; 

import javax.script.Bindings; 
import javax.script.ScriptContext; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 

public class MyClass { 
    private int field; 

    public int getField() { 
     return field; 
    } 

    public void setField(final int field) { 
     this.field = field; 
    } 

    public String toString() { 
     return String.format("{%d}", field); 
    } 

    public static void main(String[] args) throws ScriptException { 
     final ScriptEngineManager manager = new ScriptEngineManager(); 
     final ScriptEngine e = manager.getEngineByName("js"); 

     final Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE); 

     final List<MyClass> somelist = new ArrayList<MyClass>(); 
     somelist.add(new MyClass()); 

     b.put("somelist", somelist); 

     final StringBuilder script = new StringBuilder() 
      .append("function abc(x,y) { return x+y+new java.lang.Integer(2).intValue(); }") 
      .append("somelist.get(0).setField(abc(2,3));") 
      .append("somelist.add(new Packages.lv.test.MyClass()); somelist.get(1).setField(888);"); 

     e.eval(script.toString()); 

     System.out.println(somelist); // [{7}, {888}] 
    } 
}