8

我们可以在 GWT 中使用这个 $entry 方法来允许外部 javascript 执行 java 方法。您可以在他们的文档中查看解释https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#calling

但是,该示例仅使用静态方法。我正在尝试为非静态方法编写它,当我尝试调用它时,出现异常:

java.lang.ClassCastException: Cannot cast com.google.gwt.core.client.JavaScriptObject$ to mypackage.MyModule

这是我的代码:

public native void setRefreshModuleCallback() /*-{
    $wnd.refreshModule = $entry(function() {
        this.@mypackage.MyModule::refreshModuleJava();
        alert('test');
    });
}-*/;

public void refreshModuleJava() {
    logger.log(Level.WARNING, "REFRESH");
}

我觉得很有趣的是调用了警报,我在浏览器中看到了结果,但是没有执行之前的调用。

你知道是否真的可以做这样的事情吗?

4

1 回答 1

11

$entry不是关于调用 java,而是关于确保 GWT 中的一些事情顺利进行:异常被路由到, 并且通过GWT.UncaughtExceptionHandler调度的命令被正确调用。 Scheduler#scheduleEntryScheduler#scheduleFinally

你的问题是this. 当函数被调用时,this不是你的MyModule类(它很可能是$wnd对象)。这就是为什么您链接到的问题使用var that = this. 这是关于范围界定的。

您还需要实际调用该方法,而不仅仅是引用它:在 JSNI 中,第一对括号用于形式参数(以消除重载的歧义),您需要另一对传递实际参数:that.@mypackage.MyModule::refreshModuleJava()().

于 2013-03-07T15:37:58.663 回答