Как получить доступ к статическому идентификатору метода из 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 );
}