如何使用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代码。
我在这里有一个工作的例子:
- javax.annotations.Nonnull上的TypeNotPresentException
- selenium chromedriver认证代理
- Lotus Notes Java应用程序找不到notes.ini
- 如何告诉Eclipse包含所有项目的标准.jar库
- 如何避免使用collection fetch指定的警告“firstResult / maxResults; 在内存中应用!“在使用Hibernate时?
- 更快地获取大型目录内容(java.io.File替代品)
- 为什么Calendar.get(Calendar.MONTH)返回0?
- 使用Hessian 4.0.7和Spring 3.1.1时出现HessianConnectionException:(HTTP)500错误
- 更改我的java应用程序的图标