2015-09-15 6 views
1

Я не могу получить request_id из MyJavaObject в GWT JSNI, как этот пример, но получил неопределенное значение.Как получить доступ к идентификатору статического метода из 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; 

}-*/; 

ответ

0

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

Читать doc здесь: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#methods-fields, ваш метод должен быть написан следующим образом:

public static native void expose()/*-{ 

    var val = [email protected]::request_id; 
    // Do something with val... 
}-*/; 

Редактировать после комментария:

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

public static native void expose()/*-{ 

    var val = @com.my.app.MyJavaObject::[email protected]::request_id; 
    // Do something with val... 
}-*/; 

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

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

    var val = [email protected]::request_id; 
    // Do something with val... 
}-*/; 

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

public static native void expose() { 
    return expose(MY_REQUEST); 
} 
+0

Я отредактировал код jsni. Я хочу получить статический объект MY_REQUEST.request_id – kaneyip

0

Проблема заключается в том, что пока вы ссылаетесь на полный тип, в котором находится поле 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 = [email protected]::request_id; 
    //do something useful with these values... 
}-*/; 

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

Смежные вопросы