0

我有一个 javascript 资源并应用 Rhino 脚本引擎从 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.eval("window.Result"),而不是jsEngine.get("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 回答