Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT-从外部javascript调用实例方法_Gwt_Jsni - Fatal编程技术网

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

GWT-从外部javascript调用实例方法,gwt,jsni,Gwt,Jsni,我们可以在GWT中使用这个$entry方法来允许外部javascript执行java方法。 您可以在他们的文档中看到解释 然而,这里的示例仅限于静态方法。我试图为非静态方法编写它,当我试图调用它时,我得到一个异常: java.lang.ClassCastException: Cannot cast com.google.gwt.core.client.JavaScriptObject$ to mypackage.MyModule 这是我的密码: public native void setRe

我们可以在GWT中使用这个$entry方法来允许外部javascript执行java方法。 您可以在他们的文档中看到解释

然而,这里的示例仅限于静态方法。我试图为非静态方法编写它,当我试图调用它时,我得到一个异常:

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");
}
我发现非常有趣的是,警报被调用,我在浏览器中看到结果,但之前的调用没有执行


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

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

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


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

注意,我看过这篇文章,它没有帮助(或者我错过了一些东西)我尝试了“var that=this;”并调用了“that”。@mypackage.MyModule::refreshModuleJava();”但仍然得到了相同的行为更新答案和其他信息,但是
var that=this
至少应该会使错误消失。@ThomasBroyer详尽的解释。你救了我一天。