GWT - 从外部javascript调用实例方法

时间:2013-03-07 15:29:28

标签: gwt jsni

我们可以在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");
}

我发现非常有趣的是调用了警报,我在浏览器中看到了结果,但之前的调用没有执行。

你知道实际上是否可以做这样的事情?

1 个答案:

答案 0 :(得分:10)

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

您的问题是this。调用该函数时,this不是您的MyModule类(它最可能是$wnd对象)。这就是您链接到的问题使用var that = this的原因。这是关于范围

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