【问题标题】:Using .apply() on a Java method from rhino (JavaScript)在 rhino (JavaScript) 的 Java 方法上使用 .apply()
【发布时间】:2012-10-01 01:08:26
【问题描述】:

我想使用 rhino(JavaScript 的)function.apply() 将参数传递给 varags Java 方法,如下所示:

function sprintf()
{
    return java.lang.String.format.apply(arguments);
}
sprintf("%d\n", 5);

但是调用sprintf() 会报错:

Error: can't find method java.lang.String.format().

我想这是因为format() 方法不是正确的JavaScript 函数而是Java 方法,所以它没有定义apply()。 (尽管错误消息似乎不是这样说的,所以可能不是。)

我确实发现我可以添加自己的 apply() 方法:

java.lang.String.format.apply = function() {}

但是如果你明白我的意思,我看不出没有apply() 怎么写apply()。有什么想法吗?

【问题讨论】:

  • 由于 Java “varargs”实际上是作为数组实现的,因此可以将数组直接从 JavaScript 传递给 Java 函数。

标签: java javascript rhino


【解决方案1】:

@Vincent Montressor

这里是部分解决方案:

function sprintf(string) {
  var args = Array.prototype.splice.call(arguments, 1);

  for (var i = 0; i < args.length; i++) {
    if (!isNaN(args[i])) {
      args[i] = new java.lang.Integer(args[i]);
    }    
  }

  return java.lang.String.format(String(string), args);
}

有几个问题:

  • 在您的实现中 .format() 方法签名未正确使用,即第一个参数应为字符串
  • 参数列表中的数值必须转换为正确的 java 类型。

这是示例调用:

print(sprintf("Hello %s %d", "number", 2));

产生:“Hello number 2”

【讨论】:

  • 谢谢!我对此稍作修改以创建Doubles 或Longs(取决于Math.round() 是否修改了值),结果满足我的需要。非常感谢!
  • @Vincent 如果这个答案解决了你的问题,你应该“接受”它。 (点击答案左侧的复选标记。)
【解决方案2】:

找不到 java.lang 你在 String 对象中使用“格式”{method}。如果找到 String.format 则使用:

 format("Hello, %s!", [firstName]);

你 formatString 函数创建 sprintf

function sprintf() {
    return String.format.apply(arguments);
}

我认为使用 format() 函数...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2023-03-12
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多