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

标签 java javascript rhino

我有一个简单的 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/

相关文章:

java - 如何在 OSX 10.6 Snow Leopard 上最好地安装 Rhino

java - 是否可以在 Java 6 中为 RhinoScriptEngine 设置优化级别?

Java Nimbus Look and Feel per component customization ("Nimbus.Overrides") - 其他实例也受影响

javascript - 随机背景颜色脚本仅更改三个标签之一的背景颜色

java - 编码java Cookie值

javascript - 生成表的绝对表头

javascript - 如何在 javascript 或 jQuery 中创建空白字符串 ("")?

java - Rhino 中的类型错误 : migration from Java 6 to Java 7

java - 如何在 UNIX 中获取 Java 类的返回值

Java网络服务: User defined meta-data