我没有从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...
}-*/;
这也可以在一行中实现,但往往是不可读的,所以我要避免它。