在Rhino(JavaScript)中使用.apply()调用Java方法

4
我想使用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() 的情况下编写它,如果你明白我的意思的话,有任何想法吗?


由于Java的“varargs”实际上是作为数组实现的,因此直接从JavaScript将数组传递给Java函数可能有效。 - Pointy
2个回答

1

@文森特·蒙特雷索

这是一个部分解决方案:

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

这将产生:"你好,数字2"


谢谢!我稍微修改了一下,以创建DoubleLong(取决于Math.round()是否修改了值),结果满足我的需求。非常感谢! - Vincent Montressor
@Vincent 如果这个答案解决了你的问题,你应该“接受”它。(点击答案左侧的复选标记。) - Fildor

0

如果在使用 String 对象的 {method} 方法时出现“java.lang未找到”,则需要安装 String.format。如果已经安装了 String.format,则可以直接使用:

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

你的 formatString 函数创建了 sprintf

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

在我看来,使用 format() 函数...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接