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

时间:2015-04-27 21:15:18

标签: java javascript gwt annotation-processing

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

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

GWT Generator和Java Annotation Processor有什么区别?

2 个答案:

答案 0 :(得分:3)

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生成器和注释处理器是不同的东西,具有不同的目标。在许多情况下,您几乎可以互换地使用其中一个(例如AutoBeans,RequestFactory,编辑器框架,GWT中的PlaceHistoryMappers可以使用注释处理器完成),但并非总是如此。

答案 1 :(得分:1)

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

我个人认为,GWT将停止使用发电机,并尽可能地开始使用注释处理器。看看Singular。 Daniel Kurka创建的这个框架不使用生成器。它是使用注释处理器创建的。

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

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

GWT小组中也有一个帖子:

https://groups.google.com/forum/#!topic/google-web-toolkit-contributors/RYZulixEQWg

希望有所帮助。