【发布时间】:2015-04-27 21:15:17
【问题描述】:
GWT 使用 Generator 在将所有内容转换为 JavaScript 之前创建代码。
另一方面,Java 有一个注解处理器,它会在所有内容被转换为字节码之前生成代码。
GWT 生成器和 Java 注释处理器有什么区别?
【问题讨论】:
标签: java javascript gwt annotation-processing
GWT 使用 Generator 在将所有内容转换为 JavaScript 之前创建代码。
另一方面,Java 有一个注解处理器,它会在所有内容被转换为字节码之前生成代码。
GWT 生成器和 Java 注释处理器有什么区别?
【问题讨论】:
标签: java javascript gwt annotation-processing
GWT 生成器不仅生成代码,还告诉 GWT 使用它;而注解处理器只生成需要被其他代码使用的代码(或者直接在代码中引用,或者通过反射加载——这在 GWT 环境中是不可能的)。
调用生成器和处理器的方式也非常不同。 GWT 为每个需要处理的类型、每个排列实例化并运行一个生成器(这源于上述差异:生成器告诉 GWT 为作为输入传递的给定类型实际实例化哪个类),而注解处理器每次实例化一次编译,然后为每个处理轮重复调用,其中每个轮处理一组类型。
GWT 支持 permutations,其中生成的类可以根据绑定属性的值而有所不同,以实现 延迟绑定(GWT 生成器只是延迟的一个方面捆绑)。请注意,GWT 生成器实际上必须 生成任何东西,它们也可以只选择现有的类。您只能通过生成将在运行时选择给定实现的代码来使用注释处理器来近似这一点。
换句话说,如果您为语言环境en-US 和fr-FR 生成特定的实现;使用 GWT 生成器,当调用生成器时,它知道置换是关于哪个语言环境的,因此它可以告诉 GWT 使用该特定实现。最终结果就像代码中的 GWT.create() 被替换为 new TheGeneratedClass(),并且该类可以根据排列而有所不同(例如 MyMessagesImpl_en_US 与 MyMessagesImpl_fr_FR)。使用注释处理器,您必须生成两个类,然后根据上下文动态(在运行时)在它们之间进行选择(您可以生成工厂来帮助执行此操作,但您仍然必须以某种方式提供工厂使用当前的上下文,例如当前的语言环境)。
最后,触发它们的方式不同。 GWT 的延迟绑定仅由代码中的GWT.create() 触发,即在编写时尚未确定的类的实例化;而注释处理器仅由元素(包、类型、字段、方法、参数,甚至在 Java 8 中的类型参数或使用类型的任何地方)上存在注释来触发。
GWT 生成器和注释处理器是不同的东西,具有不同的目标。在许多情况下,您几乎可以互换使用其中的一种(例如 AutoBeans、RequestFactory、Editor 框架、GWT 中的 PlaceHistoryMappers 可以使用注释处理器完成),但并非总是如此。
【讨论】:
GWT.create() 来触发最小可能生成器的工厂。注释处理器的问题在于,您需要一些工具(例如 IDE 或文件观察器)才能在开发模式下自动触发它们,而 Eclipse 就是出了名的糟糕。或者也许让 GWT 自己运行注释处理器? (并在生成器生成的代码上运行它们?)
事实上,他们也在做同样的事情。两者都生成代码,并且都不能更改现有的类。注释处理器由注释启动,而 GWT 编译器由 GWT.create 语句启动。与注释处理器相比,生成器的信息量存在一些差异。还有一些东西不能很好地与注释处理器一起使用,例如处理 xml 文件等。
我个人的看法是,GWT 将停止使用生成器,并尽可能开始使用注释处理器。看看单数。 Daniel Kurka 创建的这个框架不使用生成器。它是使用注释处理器创建的。
使用注释处理器将加速超级开发模式。无需等到所有生成器都在那里工作。
目前我正在考虑替换 mvp4g 框架的生成器并改用注释处理器。我认为这将是一个很大的改进。
GWT组里也有一个帖子:
https://groups.google.com/forum/#!topic/google-web-toolkit-contributors/RYZulixEQWg
希望对您有所帮助。
【讨论】: