我正在尝试访问当前位于JavaScriptObject属性中但转换失败的Java对象。这是我的工作:
public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
return obj['myProp'];
}-*/;
obj.myProp是一个Java对象,由Java构造函数创建(在导出后在Javascript中可见)。我运行上面的代码时的结果是在开发模式下的java.lang.ClassCastException。
然而,如果喜欢下面并访问秘密属性g它的工作原理!似乎gwt在转换返回值时不会删除包装器。
public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
return obj['myProp'].g;
}-*/;
上面的代码有效,但它不是解决方案,因为它使用gwt中的实现细节。我做错了什么?
谢谢/约翰
通过测试发现了一些新的结论:
似乎问题依赖于gwt-exporter导出的对象未按照我在本机代码中的预期进行转换。
知道gwt-exporter中实现细节的人是否可以确认我的假设?
答案 0 :(得分:1)
现在我找到了一种方法。我对本机代码和普通JavaScript的区别对待的结论取决于导出的类不在当前范围内,需要由$wnd
作为前缀。
以下是我将JavaScriptObject
转换为导出的类Icon
的方法。它有点尴尬,但它的工作原理并不依赖于实现细节。
public class ConvertUtils implements Exportable {
private static Icon icon_;
public static Icon icon(JavaScriptObject obj) {
icon_ = null;
setIconNative(obj);
return icon_;
}
private static native void setIconNative(JavaScriptObject obj) /*-{
$wnd.ravegeo.ConvertUtils.setIcon(obj);
}-*/;
@Export
public static void setIcon(Icon icon) {
icon_ = icon;
}
}
诀窍是通过导出的方法传输对象,然后将其解包(setIcon方法)。