如何使用Rhino在Javascript中将Java类中的方法添加为全局函数?

我有一个简单的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()); 

然后在Javascript代码中使用utils.deal(...) 。 我也可以在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())) 

我不确定如何使用JSR-223 API,但是使用Rhino API,您可以使用要添加的方法创建一个FunctionObject

 Class[] parameters = new Class[] { String.class, Integer.class }; Method dealMethod = Utils.class.getMethod("deal", parameters); engine.put("deal", new FunctionObject("deal", dealMethod, scope)); 

该文档可从https://www.mozilla.org/rhino/apidocs/org/mozilla/javascript/FunctionObject.html获取 。

您可能需要引用Rhino库来访问FunctionObject类,我不确定如何使用JSR-223 API获取scope对象(尽管null可能会起作用)。

如果您使用rhino API而不是ScriptEngine API,则可以使用此答案: https : //stackoverflow.com/a/16479685/1089998 。

我更喜欢这种方法而不是Noah的答案,因为这意味着你不需要在每次执行之前执行随机的javascript代码。

我在这里有一个工作的例子:

https://github.com/plasma147/rhino-play