GWT生成器和Java注释处理器之间的区别



GWT使用Generator在所有内容转换为JavaScript之前创建代码。

另一方面,Java有一个注释处理器,它在所有内容转换为字节码之前生成代码。

GWT生成器和Java注释处理器之间有什么区别

GWT生成器不仅生成代码,还告诉GWT使用它;而注释处理器只生成需要其他代码使用的代码(要么在代码中直接引用,要么通过反射加载——这在GWT环境中是不可能的)。

调用生成器和处理器的方式也大不相同。GWT为每个需要处理的类型、每个置换实例化并运行生成器(这源于上述差异:生成器告诉GWT为作为输入传递的给定类型实际实例化哪个类),而注释处理器在每次编译时实例化一次,然后在每个处理轮中重复调用,其中每一轮处理一组类型。

GWT支持排列,其中生成的类可以根据绑定属性的值而不同,以实现延迟绑定(GWT生成器只是延迟绑定的一个方面)。请注意,GWT生成器实际上并没有来生成任何东西,它们也可以只选择一个现有的类。您只能使用注释处理器通过生成将在运行时选择给定实现的代码来近似这一点
换句话说,如果您为区域设置en-USfr-FR生成特定的实现;使用GWT生成器,当生成器被调用时,它知道置换是关于哪个区域设置的,所以它可以告诉GWT使用那个特定的实现。最终结果是,代码中的GWT.create()new TheGeneratedClass()替换,并且该类可以根据排列而不同(例如,MyMessagesImpl_en_USMyMessagesImpl_fr_FR)。使用注释处理器,您必须生成这两个类,然后根据上下文动态地(在运行时)在其中进行选择(您可以生成一个工厂来帮助实现这一点,但您仍然必须以某种方式向工厂提供当前上下文,例如当前区域设置)。

最后,触发它们的方式是不同的。GWT的延迟绑定仅由代码中的GWT.create()触发,即在编写类时实例化一个尚未确定的;而注释处理器仅仅是由元素(包、类型、字段、方法、参数,甚至在Java 8中是类型参数或使用类型的任何地方)上的注释的存在来触发的。

GWT生成器和注释处理器是不同的东西,有不同的目标。在许多情况下,您可以几乎可互换地使用其中一个或另一个(例如,GWT中的AutoBeans、RequestFactory、Editor框架、PlaceHistoryMappers可以使用注释处理器来完成),但并不总是如此。

事实上,他们也在做同样的事情。两者都生成代码,并且都不能更改现有类。注释处理器由注释启动,GWT编译器由GWT.create语句启动。与注释处理器相比,生成器的信息量存在一些差异。还有一些事情在注释处理器中不能很好地工作,例如处理xml文件等。

我个人的观点是,GWT将停止使用生成器,并在可能的情况下开始使用注释处理器。看看Singular。这个由Daniel Kurka创建的框架不使用生成器。它是使用注释处理器创建的。

使用注释处理器将加快超级开发模式。没有必要等到所有发电机都工作了。

目前,我正在考虑替换mvp4g框架的生成器,转而使用注释处理器。我认为这将是一个很大的改进。

GWT组中还有一个线程:

https://groups.google.com/forum/#!主题/谷歌网络工具包贡献者/RYZulixEQWg

希望能有所帮助。

最新更新