我正在使用SmartGWT,我希望从JavaScript访问com.smartgwt.client.Version
。在Firefox的Web控制台中,我尝试过:
frames[0].$entry(Lcom_smartgwt_client_Version::getVersion()));
和
frames[0].$entry(@com.smartgwt.client.Version.getVersion());
和
frames[0].$entry(@com.smartgwt.client.Version::getVersion());
和
frames[0].$entry(@com.smartgwt.client.Version::getVersion()());
但是所有这些都返回语法错误。
SmartGWT与我的WAR一起部署,当我frames[0]
时,我可以看到列出的其他SmartGWT类。
调用此静态Java方法的正确语法是什么?
答案 0 :(得分:6)
除了java文件中的JSNI代码之外,这些JSNI引用不起作用。 JSNI中对Java方法和字段的引用实际上并不是有效的JavaScript,而是JSNI语言的一部分,它使这些本机方法都能使用Java和JavaScript。 JSNI字符串@com.smartgwt.client.Version::getVersion()()
将被重写为PRETTY中的$getVersion1()
,或者在OBF模式下只有一两个字符的长度,因此您不能依赖该方法名称相同。
相反,您需要从应用程序内部导出JavaScript函数,以便此外部JavaScript可以调用它。有关详细信息,请查看https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#calling。
以下是您的应用程序中的外观示例:
public native void exportGetVersion() /*-{
$wnd.getSmartGwtVersion = $entry(function() {
return @com.smartgwt.client.Version::getVersion()();
});
}-*/;
确保在您的应用程序中调用此函数以导出该函数 - 在调用之后的任何时间,您都可以从常规JavaScript调用getSmartGwtVersion()
- 无需使用frames
或{{ 1}}。