当前位置: 首页 > 面试题库 >

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

鱼志学
2023-03-14
问题内容

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


 类似资料:
  • 本文向大家介绍Yii2中添加全局函数的方法分析,包括了Yii2中添加全局函数的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii2中添加全局函数的方法。分享给大家供大家参考,具体如下: 方法一 这种方法就是直接在入口文件web/index.php里面写函数,示例代码如下: 这个方法虽然可以实现,但是本人不推荐,因为改了框架本身的代码,而且如果全局函数多了的话,也不好管理。 方法

  • 我正在尝试迁移/更新我的项目,以使用Rhino的Nashorn。我用Java实现了一些全局实用程序函数,并将其添加到目标脚本引擎的全局范围中,典型的例子是。 在Rhino中,它是通过 其实例已添加到目标范围。如果是纳肖恩,该怎么办?我找不到如何为Nashorn实现独立函数。

  • 问题内容: 我将以下JavaScript文件“ test.js”编译为“ test.class”: 我想在简单的Java程序“ run.java”中调用已编译的JavaScript函数“ test.addNumbers(1,2)”,如下所示: 我尝试了很多方法,但是失败了。我阅读了Rhino教程,并检查了许多文章和示例,但它们仅显示了如何从命令行或源文件“ test.js”中调用JavaScrip

  • 问题内容: 我有以下内容: 如何将类型为sun.org.mozilla.javascript.internal.NativeArray的结果对象转换为相应的Java数组?Somone可以向我显示一个 工作代码示例 吗?它应该适用于String和Integer数组。另外,很高兴知道在哪里寻找在rhino引擎和java之间的其他数据类型转换。 顺便说一句,我知道此页面,但我真的在寻找一个有效的代码示例

  • 如何在下面的代码中使用setter? 我已经尝试了下面的方法来使用我的类,但得到了一个无法解决的方法错误。

  • 我正在尝试设置JavaFX环境,因此我引用了相应的jar。为了运行代码,我需要在launch.json中使用一些VM参数(“vmArgs”:--module path/Users/adrif/Downloads/javafx-sdk-14.0.2.1/lib--add modules javafx.controls,javafx.fxml”)。我在一个多项目文件夹中工作,因此每次创建一个新项目时,