有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图访问当前位于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导出器导出的对象没有像我在本机代码中预期的那样进行转换

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

了解gwt exporter中实施细节的人能否确认我的假设


共 (1) 个答案

  1. # 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方法)传输对象,然后将其展开