6

作为新项目的一部分,我正在尝试快速学习 GWT。我发现 GWT 没有实现 Java 的 String.format() 函数,所以没有类似 printf() 的功能。我知道 Javascript 存在一些 printf() 实现,所以我想我可以将其中之一粘贴为 GWT Javascript Native Interface 函数。我遇到了问题,并决定我最好确保正确传递可变参数值。这就是事情变得丑陋的地方。首先,一些示例代码:

// From Java, call the JSNI function:
test("sourceString", "params1", "params2", "params3");

....

public static native void test(Object... params) /*-{   
    // PROBLEM: this kills GWT!
    // alert(params.length);  

    // returns "function"
    alert(typeof(params));      

    // returns "[Ljava.lang.Object;@b97ff1"
    alert(params);
}-*/;

GWT 文档指出“从 Java 调用 varargs JavaScript 方法将导致被调用者接收数组中的参数”。我认为这意味着我至少可以检查 params.length,但是访问它会抛出一个包裹在 UmbrellaException 中的 JavascriptException,而没有任何真实信息。当我执行“typeof(params)”时,它返回“function”。好像这还不够奇怪,如果我检查 params 的字符串值,它会返回似乎是 Java 引用的字符串版本。

所以,我想我在这里问了几个不同的问题:

1) GWT/JSNI 可变参数是如何工作的,我需要做一些特殊的事情来传递值吗?
2)这里到底发生了什么?
3) 有没有更简单的方法在 GWT 应用程序中获取 printf() 样式的格式?

4

1 回答 1

5

您的 JSNI 方法正在接收参数,但不幸的是,无法对它们做任何事情。Java 数组(可变参数是通过构造传递参数的数组来实现的)在传递给 JSNI 方法时是不透明的。但是,您可以使用JsArrayString实现您的目标:

public static native void test(JsArrayString strings) /*-{
  // strings is a normal JavaScript array of strings
}

并调用方法:

String[] jStrings = {"one", "two", "three"};
JsArrayString jsStrings = (JsArrayString)JsArrayString.createArray();

for (String s : jStrings) {
  jsStrings.push(s);
}

test(jsStrings);
于 2011-02-23T00:28:51.730 回答