我有一个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[] {} );
}发布于 2014-03-31 17:02:15
我发现你的代码有几个问题:
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(名称)获取变量的值。如果需要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!!!");
}https://stackoverflow.com/questions/18615281
复制相似问题