mar*_*son 5 java gwt printf variadic-functions jsni
我正在尝试快速学习GWT作为新项目的一部分.我发现GWT没有实现Java的String.format()函数,因此没有类似printf()的功能.我知道Javascript存在一些printf()实现,所以我想我可以将其中一个作为GWT Javascript Native Interface函数粘贴.我遇到了问题,并决定我最好确保varargs值正确传递.这就是事情变得丑陋的地方.首先,一些示例代码:
// 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);
}-*/;
Run Code Online (Sandbox Code Playgroud)
GWT文档声明"从Java调用varargs JavaScript方法将导致被调用者接收数组中的参数".我想这意味着我至少可以检查params.length,但访问它会抛出一个包含在UmbrellaException中的JavascriptException,没有真正的信息.当我做"typeof(params)"时,它返回"function".好像这不够奇怪,如果我检查params的字符串值,它会返回看似是Java引用的字符串版本.
所以,我想我在这里问了几个不同的问题:
1)GWT/JSNI varargs如何实际工作,我是否需要做一些特殊的事情来传递价值观?
2)这里到底发生了什么?
3)有没有更简单的方法在GWT应用程序中获得printf() - 样式格式?
您的JSNI方法正在接收参数,但遗憾的是,它们无法对它们执行任何操作.Java数组(varargs是通过构造传递的参数的数组实现的)在传递给JSNI方法时是不透明的.但是,您可以使用JsArrayString实现目标:
public static native void test(JsArrayString strings) /*-{
// strings is a normal JavaScript array of strings
}
Run Code Online (Sandbox Code Playgroud)
并调用方法:
String[] jStrings = {"one", "two", "three"};
JsArrayString jsStrings = (JsArrayString)JsArrayString.createArray();
for (String s : jStrings) {
jsStrings.push(s);
}
test(jsStrings);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3213 次 |
| 最近记录: |