如何从GWT JSNI访问静态方法id



我没有从GWT JSNI中获得request_id,就像这个例子一样,但得到了未定义的值。

请帮助。JAVA类

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;
}-*/;

试图从静态方法访问非静态成员变量,而不引用该对象

阅读这里的文档:http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#methods-fields,你的方法应该这样写:

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 );
}

问题是,当您引用MY_REQUEST字段所在的完整类型时,您不是引用request_id所在的完整类型。由于JS有一个非常不同的类型层次结构的概念,当我们从JS中引用Java时,我们需要非常具体。

当您引用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...
}-*/;

这也可以在一行中实现,但往往是不可读的,所以我要避免它。

最新更新