java - 从 Javascript JSNI 调用 Java

标签 java gwt smartgwt jsni

我正在使用 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/

相关文章:

java - 双重格式验证中的 JSpinner

java - 实现 try 和 catch block

internet-explorer - 带有弹出窗口和 iFrame 的 GWT/GXT 应用程序,在带有 Adob​​e reader 的 Internet Explorer 下,PDF 不会隐藏

javascript - 如何在 GWT 中使用 angularJs?

java - GWT 文本区域样式

smartgwt - smartgwt中的HLayout和HStack有什么区别?

java - 如何在 Java 中安全地停止和恢复线程?

java - smartGwt 关闭 clickHandler

java - 如何使用 SmartGWT 手动/以编程方式打开 ComboboxItem/SelectItem 的 pickList?

java - Fragment 和 Android 生命周期