ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在GWT Javascript Native Interface中使用Java varargs? (又名“GWT没有printf()”)

2019-05-21 22:49:42  阅读:311  来源: 互联网

标签:java printf variadic-functions gwt 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);
}-*/;

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
}

并调用方法:

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

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

test(jsStrings);

标签:java,printf,variadic-functions,gwt,jsni
来源: https://codeday.me/bug/20190521/1149088.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有