【问题标题】:Call Java function from JSNI从 JSNI 调用 Java 函数
【发布时间】:2013-06-19 02:17:03
【问题描述】:

我在 JSNI 调用 Java 方法时遇到问题:

public static native void update() /*-{
    this.@app.client.local.MyPage::populate()();
}-*/;

没有错误,只是该方法没有被触发,Java 方法populate() 在调用时显示一个警告框,没有触发。

MyPage 然而是一个带有 @Page 注释的 Errai 页面

【问题讨论】:

    标签: java gwt errai


    【解决方案1】:

    我认为您误解了 JSNI 中 @ 符号前面的实例的含义。

    您正在调用实例this 的方法populate(),但您的update() 方法是静态的。

    您要么将populate() 定义为静态并以静态方式调用它。

    package app.client.local;
    class MyPage {
    
      public static native void update() /*-{
        @app.client.local.MyPage::populate()();
      }-*/;
    
      public static void populate() {
      }
    }
    

    或者您可以将具有该方法的类的实例作为参数传递给您的 jsni 代码:

    package app.client.local;
    
    class MyClass {
      public void populate() {
      }
    }
    
    class MyPage {
      public static native void update(MyClass instance) /*-{
        instance.@app.client.local.MyClass::populate()();
      }-*/;
    }
    

    【讨论】:

    • 我不确定我是否正确理解了您的答案,您的意思是我必须将其设为静态或传递 MyClass 实例?我不确定我可以同时做到 1) 使其成为静态,不能使用方法 2) 传递 MyClass 实例,也可以这样做,JNSI 方法 update() 是 Utility 类的一部分
    • 其实我想从 JSNI 调用 java 方法的关键是能够在应用程序的任何地方触发 populate() 方法...
    • 我说的是,如果方法是静态的,就不需要类的实例,所以调用就像第一个块。如果方法不是静态的,你需要实例,所以你必须将它作为参数传递,或者你需要一个指向实例的js变量(即:你可以将实例分配给一个窗口变量)
    • 要在应用程序的任何地方调用静态方法,您不需要 JSNI。如果它是实例方法,请将实例引用保存在应用程序的任何位置(可能是具有静态属性的抽象类)。另一种选择是将实例保存在窗口变量中,但这是您想要的吗?
    • @manola,MyClass populate() 方法不是静态方法,所以我不能在任何地方调用它。此外,我还需要在 JSNI 中的 Javscript 代码中调用 populate() java 方法......就像在 Jquery 事件期间一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多