在GWT中将JavaScriptObject转换为Java对象失败

Converting JavaScriptObject to Java object fails in GWT

本文关键字:Java 对象 失败 转换 GWT 中将 JavaScriptObject      更新时间:2023-09-26

我正在尝试访问当前位于JavaScriptObject属性中的Java对象,但转换失败。我是这样做的:

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
  return obj['myProp'];
}-*/;

obj.myDrop是一个由Java构造函数创建的Java对象(导出后在Javascript中可见)。当我运行上面的代码时,结果是在开发模式下出现java.lang.ClassCastException。

然而,如果你喜欢下面并访问秘密属性g,它就可以工作了!gwt在转换返回值时似乎没有删除包装器。

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{
  return obj['myProp'].g;
}-*/;

上面的代码有效,但它不是一个解决方案,因为它使用了gwt中的实现细节。我做错了什么?

谢谢Johan

测试发现的一些新结论:

问题似乎取决于gwt导出器导出的对象没有像我在本机代码中预期的那样转换。

  • 导出的对象被包装,原始对象存储在名为g的属性中
  • 由于GWT不知道这一点,它无法从包装的导出对象中检索原始对象
  • 当通过导出的接口时,包装和展开是自动的
  • 这种情况的例外似乎是在本机方法中执行处理导出对象的代码时。本机方法的行为与定义为javascript的代码不同,因为它们似乎不处理导出展开。这是通过尝试调用以导出对象为参数的导出方法发现的。它在本机代码中失败了,但在普通javascript中也成功了

了解gwt exporter中实现细节的人能证实我的假设吗?

现在我找到了一种方法。我的结论是,本机代码和普通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方法)将对象转移到展开的位置。