2012-07-14 28 views
1

我有一個Java應用程序(A),它應該使用一個javascript函數(B),用rhino進行評估,在返回A之前更改一些對象。重點是,從A到B傳遞的參數是複雜的(List),並且從B返回的類型也應該是相同的類型。 目前我不知道如何在javascript函數中使用我自己的類。我應該使用JavaScript導入他們?使用複雜對象作爲參數調用Java中的JavaScript函數

我使用rhino how to call js function from java加載和運行我的JavaScript函數。

在此先感謝!

+0

什麼導入javascript?你的java類? – MaVRoSCy 2012-07-14 10:40:37

+0

@MaVRoSCy:是的,我想在JavaScript中使用我自己的類。序列化爲JSON是我的一個想法... – hans 2012-07-14 11:04:08

回答

0

查看示例。它使用jsr223,但你會明白。我將MyClass的一個實例傳遞給rhino,它會修改它(通過java方法調用),並最終添加另一個元素來列出。

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}] 
    } 
} 
相關問題