Как получить доступ к статическому идентификатору метода из GWT JSNI

Мне не удалось получить request_id из MyJavaObject в GWT JSNI, как в этом примере, но я получил неопределенное значение.

Пожалуйста помоги.

JAVA CLASS

package com.my.app;

    class MyJavaObject
    {
        public final int request_id;

        public MyJavaObject(int request_id)
        {
            this.request_id = request_id;
        }

        public static final MyJavaObject MY_REQUEST = new MyJavaObject(13);
    }

GWT JSNI

public static native void expose()/*-{

    var val = @com.my.app.MyJavaObject::MY_REQUEST.request_id;

}-*/;

2 ответа

Проблема заключается в том, что в то время как вы ссылаетесь на полный тип, где MY_REQUEST поле жизни, вы не ссылаетесь на полный тип, где request_id жизни. Поскольку JS имеет совершенно другое понятие иерархии типов, когда мы ссылаемся на Java из JS, мы должны быть очень конкретными.

Когда вы ссылались MY_REQUESTвы сделали это, используя синтаксис @classname::fieldname. Вы также должны сделать это, чтобы получить request_id поле:

public static native void expose()/*-{
  var myRequest = @com.my.app.MyJavaObject::MY_REQUEST;
  var id = myRequest.@com.my.app.MyJavaObject::request_id;
  //do something useful with these values...
}-*/;

Это также может быть достигнуто в одной строке, но, как правило, нечитабельно, поэтому я бы избегал этого.

Вы пытаетесь получить доступ к нестатической переменной-члену из статического метода без какой-либо ссылки на этот объект

Прочитайте документ здесь: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html, ваш метод должен быть написан так:

public static native void expose()/*-{

    var val = this.@com.my.app.MyJavaObject::request_id;
    // Do something with val...
}-*/;

Изменить после комментария:

Может быть, это может сработать:

public static native void expose()/*-{

    var val = @com.my.app.MyJavaObject::MY_REQUEST.@com.my.app.MyJavaObject::request_id;
    // Do something with val...
}-*/;

если это не так, передайте ваш объект в качестве параметра:

public static native void expose( MyJavaObject obj)/*-{

    var val = obj.@com.my.app.MyJavaObject::request_id;
    // Do something with val...
}-*/;

и либо позвонить expose( MY_REQUEST ) напрямую или создайте вспомогательную функцию

public static native void expose() {
    return expose( MY_REQUEST );
}
Другие вопросы по тегам