假设我有一个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 exporter这样的库,因为我觉得必须将其合并到处理应用程序逻辑的源代码中会使我很难将代码的这两个方面分开,如果这样做会很糟糕例如,像这样的GWT项目和Android应用程序之间共享代码。
答案 0 :(得分:0)
如果您使用GWT 2.7+,则可以使用新的JSInterop。它隐藏在编译器标志后面,但效果很好。
它仍处于试验阶段,可能会在将来的版本中发生变化。
答案 1 :(得分:0)
有different ways你可以解决问题,这也取决于你必须暴露的东西数量。
如果只是几种方法,我会使用纯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之前仍然是实验性的,所以我不相信它的生产项目。