我正在使用 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 方法的正确语法是什么?
最佳答案
除了 java 文件中的 JSNI 代码之外,这些 JSNI 引用不起作用。 JSNI 中对 Java 方法和字段的引用实际上并不是有效的 JavaScript,而是 JSNI 语言的一部分,以使这些 native 方法能够同时使用 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()
- 无需使用 框架
或$entry
。
关于java - 从 Javascript JSNI 调用 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795607/