我有一个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[] {} );
}
答案 0 :(得分:0)
可能的解决方法是将结果存储在脚本变量中并使用读取var jsEngine.get( “myResult”);
答案 1 :(得分:0)
我发现您的代码有几个问题:
jsEngine.put("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!!!");
}