gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:56 25 4
gpt4 key购买 nike

我有一个简单的 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 为每个方法编写包装函数,但应该有一种更简单的方法来自动为类的所有公共(public)方法执行此操作。

最佳答案

我对 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 脚本中实现了此功能,但我必须在绑定(bind)中设置实用程序,而不是像您的代码中那样在引擎上设置:

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()))

关于java - 如何使用 Rhino 在 Javascript 中将 Java 类中的方法添加为全局函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2552300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com