如何通过GWT中的一些JavaScript接口公开Java类的功能?



假设我有一个Java类Course,它有一些方法testMethod。我如何公开这个功能,以便我可以使用手写的JavaScript与它进行交互,如下所示:

someCourse.testMethod();

其中someCourse是通过本机方法直接从Java代码传递的,如:

private native void AssociateCourse(Course course) /*-{
    someCourse = course;
}-*/;

我在实现这一点时遇到的主要问题是GWT没有提供任何方法让我访问Course构造函数的原型。例如,以下是无效的:

private native void Expose() /*-{
    $wnd.Course = @mypackage.Course;
}-*/;

因为它希望它访问某个字段,而不是整个字段

我想避免使用像gwt出口商这样的库,因为我觉得必须将其合并到处理应用程序逻辑的源代码中,这会使我的代码的这两个方面很难分开,如果代码在gwt项目和Android应用程序之间共享,这将是一件坏事,例如。

如果您使用GWT 2.7+,则可以使用新的JSInterop。它隐藏在编译器标志后面,但工作得很好。

它仍然是实验性的,在未来的版本中可能会改变。

看一下这个演示:https://www.youtube.com/watch?v=wFMD1GXR2Tg

你可以有不同的方法来解决你的问题,这也取决于你要暴露的内容的数量。

如果只是几个方法,我会使用纯JSNI或gQuery

作为你问题的答案,在你的类构造函数中,你可以为新实例暴露方法(我不会修改java类原型):

public class Course  {
    public Course() {
        exportMethods(this);
    }
    public String testMethod(String s) {
        return s;
    }
    private native void exportMethods(Course c) /*-{
        this.testMethod = c.@mypackage.Course::testMethod(*);
    }-*/;
}

正如你所说的,gwt-exporter意味着包含一个依赖,但如果你要处理大量的导出方法,属性和回调,它是值得的。

2.7.0中可用的新东西JsInterop是非常实验性的,它缺乏很多功能,你必须在编译器中使用一个实验性编译器标志来启用它,它在2.8.0中几乎可以使用,但在3.0.0之前仍然是实验性的,所以我不会信任它用于生产项目。

最新更新