0

JavaScript リソースがあり、Rhino Script Engine を適用して Java 側からメソッドを呼び出します。

 (function( global ){

    var Result;

    (Result = function( val ) {
        this.tpl = val || '' ;
    }).prototype = {

        get: function ()
        {
            return this.tpl ;
        }

    };
} ( window ) ) ;

これは私が Java 側で行った方法ですが、上記のスクリプトで get メソッドを呼び出すにはどうすればよいですか?

    @Test
    public void testCallJSMethod() throws Exception {
        String jsResource = getJSResource();

        jsEngine.put("window", "window");
        jsEngine.put("window.Result", "Result");

        jsEngine.eval(jsResource);

        Invocable inv = (Invocable) jsEngine;

        Object obj = jsEngine.get("window.Result");
        assertEquals(true, obj != null);

        //try to call get method in above script, but it doesn't work
        inv.invokeMethod(obj, "get", new Object[] {} );
    }
4

2 に答える 2

0

これを回避するには、スクリプト変数に結果を格納し、jsEngine.get("myResult"); でその変数を読み取ります。

于 2014-01-11T19:54:38.070 に答える
0

コードにいくつかの問題があります。

    jsEngine.put("window", "window");

これは window を JavaScript オブジェクトとして定義しません。次のように実行できます。

    jsEngine.eval("window={}");

あなたの JavaScript では、Result はローカル変数であり、外部関数への呼び出しには耐えられません。代わりに、関数を global.Result に割り当てる必要があります。

(function(global) {
    (global.Result = function(val) {
        this.tpl = val || '';
    }).prototype = {
        get: function()
        {
            return this.tpl;
        }

    };
})(window);

jsEngine.get(name) は変数の値を取得します。window.Result の値が必要な場合は、jsEngine.get("window.Result") ではなく、jsEngine.eval("window.Result") を実行する必要があります。

しかし、window.Result は実際には関数です。実際にはコンストラクター関数。したがって、インスタンスを作成するには、jsEngine.eval("new window.Result('Hello world!!!')") のようにする必要があります。

したがって、Java関数は次​​のようになります。

@Test
public void testCallJSMethod() throws Exception {
    String jsResource = getJSResource();

    jsEngine.eval("window={}");

    jsEngine.eval(jsResource);

    Invocable inv = (Invocable) jsEngine;

    Object obj = jsEngine.eval("new window.Result('Hello World!!!')");
    assertEquals(true, obj != null);

    Object res = inv.invokeMethod(obj, "get", new Object[] {} );
    assertEquals(res, "Hello World!!!");
}
于 2014-03-31T09:02:14.940 に答える