如何将 Java 可变参数与 GWT Javascript 本机接口一起使用? (又名“GWT 没有 printf()”)

发布于 2024-10-18 21:18:59 字数 975 浏览 8 评论 0原文

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

// 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() 样式的格式?

I'm trying to quickly learn GWT as part of a new project. I found out that GWT doesn't implement Java's String.format() function, so there's no printf()-like functionality. I knew that some printf() implementations exist for Javascript, so I figured I could paste one of those in as a GWT Javascript Native Interface function. I ran into problems, and decided I'd better make sure that the varargs values were being passed in correctly. That's where things got ugly. First, some example code:

// 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);
}-*/;

The GWT docs state that "calling a varargs JavaScript method from Java will result in the callee receiving the arguments in an array". I figured that meant I could at least check params.length, but accessing that throws a JavascriptException wrapped in an UmbrellaException, with no real information. When I do "typeof(params)", it returns "function". As if that weren't odd enough, if I check the string value of params, it returns what appears to be a string version of a Java reference.

So, I guess I'm asking a few different questions here:

1) How do GWT/JSNI varargs actually work, and do I need to do something special to pass in values?
2) What is actually going on here?
3) Is there any easier way to get printf()-style formatting in a GWT application?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

全部不再 2024-10-25 21:18:59

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

Your JSNI method is receiving the arguments but, unfortunately, can't do anything with them. Java arrays (varargs are implemented by constructing arrays of the passed arguments) are opaque when passed to JSNI methods. You can however achieve your goal with a JsArrayString:

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

And calling the method:

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

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

test(jsStrings);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文