我们可以在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
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public native void setRefreshModuleCallback() /*-{
$wnd.refreshModule = $entry(function() {
this.@mypackage.MyModule::refreshModuleJava();
alert('test');
});
}-*/;
public void refreshModuleJava() {
logger.log(Level.WARNING, "REFRESH");
}
Run Code Online (Sandbox Code Playgroud)
我觉得非常有趣的是调用了警报,我在浏览器中看到了结果,但是之前的调用没有被执行.
你知道它是否真的可以做这样的事情?
Tho*_*yer 10
$entry它不是关于调用java,而是关于确保GWT中的一些事情顺利进行:异常被路由到GWT.UncaughtExceptionHandler,并且通过 Scheduler#scheduleEntry并Scheduler#scheduleFinally正确调用的命令被调度.
你的问题是this.调用函数时,this不是你的MyModule类(它很可能是$wnd对象).这就是您链接使用的问题var that = this.这是关于范围界定的.
你还需要实际调用该方法,而不仅仅是引用它:在JSNI中,第一对parens用于形式参数(消除重载歧义),你需要另一对传递实际参数:that.@mypackage.MyModule::refreshModuleJava()().