假设我有一个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之前仍然是实验性的,所以我不会信任它用于生产项目。