1

私はメソッド(A)を備えたJavaアプリケーションを持っています。これは、rhinoで評価されたjavascript関数(B)を使用して、Aで返す前にいくつかのオブジェクトを変更する必要があります。ポイントは、A内からBに渡されるパラメーターが複雑であるということです。 (リスト)また、Bから返されるタイプは同じタイプである必要があります。現在、javascript関数で自分のクラスを使用する方法がわかりません。誰がJavaScriptにインポートしますか?

私はrhinoを使用して、javaからjs関数を呼び出し、javascript関数をロードして実行します。

前もって感謝します!

4

1 に答える 1

0

例を参照してください。それはjsr223を使用しますが、あなたはその考えを理解するでしょう。MyClassの1つのインスタンスを含むリストを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}]
    }
}
于 2012-07-14T12:13:21.503 に答える