在rhino(JavaScript)的Java方法上使用.apply()

时间:2012-10-10 14:11:15

标签: java javascript rhino

我想使用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()。有什么想法吗?

2 个答案:

答案 0 :(得分: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));

产生:“你好2号”

答案 1 :(得分:0)

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

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

你formatString函数创建sprintf

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

在我看来,使用 format()功能......