Вызов функции Java из JSNI

У меня проблемы с JSNI, вызывающим метод Java:

public static native void update() /*-{
    [email protected]::populate()();
}-*/;

Ошибок нет, просто метод не запускается, метод Java populate(), который показывает окно предупреждения при вызове, не срабатывает.

MyPage однако это страница Errai с аннотацией @Page


person quarks    schedule 19.06.2013    source источник


Ответы (1)


Я думаю, вы не понимаете значения экземпляра, предшествующего символу @ в JSNI.

Вы вызываете метод populate() экземпляра this, но ваш метод 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) /*-{
    [email protected]::populate()();
  }-*/;
}
person Manolo Carrasco Moñino    schedule 19.06.2013
comment
Я не уверен, правильно ли я понял ваш ответ, вы имеете в виду, что я должен сделать его либо статическим, либо передать экземпляр MyClass? Я не уверен, что могу сделать и то, и другое: 1) сделать его статическим, не могу сделать это с помощью метода 2) передать экземпляр MyClass, также могу это сделать, метод JNSI update() является частью класса Utility. - person quarks; 19.06.2013
comment
На самом деле точка, с которой я хочу вызвать метод java из JSNI, заключается в том, чтобы иметь возможность запускать метод populate() в любом месте приложения... - person quarks; 19.06.2013
comment
Я говорю, что если метод статический, вам не нужен экземпляр класса, поэтому вызов похож на первый блок. Если метод не является статическим, вам нужен экземпляр, поэтому вы должны передать его как параметр или вам нужна переменная js, указывающая на экземпляр (т.е. вы можете назначить экземпляр переменной окна) - person Manolo Carrasco Moñino; 19.06.2013
comment
Чтобы вызвать статический метод в любом месте приложения, вам не нужен JSNI. Если это метод экземпляра, сохраните ссылку на экземпляр в любом месте вашего приложения (возможно, в абстрактном классе со статическими свойствами). Другой вариант — сохранить экземпляр в переменной окна, но этого ли вы хотите? - person Manolo Carrasco Moñino; 19.06.2013
comment
@manola, метод MyClass populate() не является статическим методом, поэтому я нигде не могу его вызывать. Также мне нужно вызвать java-метод populate() также внутри кода Javscript в JSNI... например, во время событий Jquery. - person quarks; 19.06.2013
comment
Это другая проблема, потому что вам нужно экспортировать свои методы/классы GWT в JS. Не могли бы вы открыть новый запрос с полным описанием того, что вы хотите? Я отвечу на него. - person Manolo Carrasco Moñino; 19.06.2013
comment
Ваш ответ правильный для вопроса, однако я решил использовать Gwt EventBus для этой цели, поскольку он более естественен для методов подписки/триггера в любом месте приложения... - person quarks; 22.06.2013
comment
Да, EventBus — это способ отделить разные части вашего приложения. Однако вы не можете вызывать шину событий из событий jquery. Я не знаю, почему вы смешиваете jquery + gwt, возможно, вы могли бы рассмотреть возможность использования gwtquery. - person Manolo Carrasco Moñino; 22.06.2013