0

我正在使用 SmartGWT,我希望com.smartgwt.client.Version从 JavaScript 访问。在 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 一起部署的,当我这样做时,我可以看到列出的其他 SmartGWT 类frames[0]

调用这个静态 Java 方法的正确语法是什么?

4

1 回答 1

6

这些 JSNI 引用除了在您的 java 文件中的 JSNI 代码中之外不起作用。JSNI 中对 Java 方法和字段的引用实际上不是有效的 JavaScript,而是 JSNI 语言的一部分,以使这些本地方法能够同时使用 Java 和 JavaScript。JSNI 字符串@com.smartgwt.client.Version::getVersion()()将被重写为类似于$getVersion1()PRETTY 中的内容,或者在 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()();
  });
}-*/;

确保您在应用程序中的某个地方调用此函数以导出该函数 - 在调用之后的任何时间,您都可以getSmartGwtVersion()从常规 JavaScript 调用 - 无需使用framesor $entry

于 2013-04-03T19:19:38.210 回答