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

Difference between a GWT Generator and a Java Annotation Processor?

GWT 在将所有内容翻译成 JavaScript 之前使用 Generator 创建代码。

另一方面,

Java 有一个注解处理器,它在将所有内容翻译成字节代码之前生成代码。

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

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

我个人的意见是,GWT 将停止使用生成器并开始尽可能使用注释处理器。看看单数。这个由 Daniel Kurka 创建的框架不使用生成器。它是使用注释处理器创建的。

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

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

GWT 组中还有一个线程:

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

希望对您有所帮助。

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

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

GWT 支持 排列,其中生成的 class 可以根据绑定属性的值而不同,以实现 延迟绑定(GWT 生成器只是延迟绑定的一方面)。请注意,GWT 生成器实际上 没有 生成任何东西,它们也可以 select 现有的 class。您只能通过生成将在运行时 select 给定实现的代码来使用注释处理器来近似此。
换句话说,如果您为语言环境 en-USfr-FR 生成特定的实现;使用 GWT 生成器,当生成器被调用时,它知道排列是关于哪个语言环境的,因此它可以告诉 GWT 使用该特定实现。最终结果就好像代码中的 GWT.create() 被替换为 new TheGeneratedClass(),并且 class 可以根据排列的不同而不同(例如 MyMessagesImpl_en_USMyMessagesImpl_fr_FR).使用注解处理器,您必须生成两个 classes,然后动态地(在运行时)在其中生成 select,具体取决于上下文(您可以生成一个工厂来帮助执行此操作,但您仍然需要以某种方式为工厂提供当前 上下文 ,例如当前语言环境)。

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

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