如何使用Rhino将Java类中的方法添加为Javascript中的全局函数?
我有一个简单的Java类,其中包含一些方法:
public class Utils { public void deal(String price, int amount) {
// ....
}
public void bid(String price, int amount) {
// ....
}
public void offer(String price, int amount) {
// ....
}
}
我想创建此类的实例,并允许Javascript代码直接调用方法,如下所示:
deal("1.3736", 100000);bid("1.3735", 500000);
我目前只能弄清楚的唯一方法是使用
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");engine.put("utils", new Utils());
然后utils.deal(...)
在Javascript代码中使用。我还可以使用Javascript为每个方法编写包装器函数,但是应该有一种更简单的方法来自动为类的所有公共方法执行此操作。
回答:
我对Rhino并不是很熟悉,但是这样的方法应该可以工作:
for(var fn in utils) { if(typeof utils[fn] === 'function') {
this[fn] = (function() {
var method = utils[fn];
return function() {
return method.apply(utils,arguments);
};
})();
}
}
只需遍历的属性utils
,并为每个作为函数的属性创建一个调用它的全局函数。
编辑:我在Groovy脚本中工作了,但是我必须在绑定中而不是像您的代码那样在引擎上设置utils:
import javax.script.*class Utils {
void foo(String bar) {
println bar
}
}
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
engine.eval("""
for(var fn in utils) {
if(typeof utils[fn] === 'function') {
this[fn] = (function() {
var method = utils[fn];
return function() {
return method.apply(utils,arguments);
};
})();
}
}
foo('foo'); // prints foo, sure enough
""",new SimpleBindings("utils":new Utils()))
以上是 如何使用Rhino将Java类中的方法添加为Javascript中的全局函数? 的全部内容, 来源链接: utcz.com/qa/401138.html