2013-06-02 83 views
4

即使花费了很多时间,我也无法理解注释处理的目的。我能想到Java注释处理 - 目的和示例

我明白为什么需要运行时的注释,最简单的例子是:标记接口的

  1. 更换。
  2. 替换某种类型的市场属性(例如瞬态)
  3. 通常,可以在运行时完成的任何有用性。

但不幸的是,我无法理解在编译时使用注释的任何实际示例/原因(除了由JDK提供的默认注释(例如@Override等))。

我无法理解使用Annotation Processors的'生成代码'的目的/需求是什么。

编辑:Javadoc /自定义Java文档是我能想到的使用注释处理程序的目的之一。

+0

这是关于在编译时使用注释的一般概念,或关于javax.annotation.processing API以及它们用于什么的问题? –

+0

编译时对注释的一般处理。 –

回答

4

这可以用于各种事情。

两个简单的例子

  1. Lombock project。厌倦了编写成千上万的获取者和安装者?为什么不让注释处理器在编译时执行它。
  2. AOP。您可以使用类似AspectJ的东西来编织依赖于注释的代码。这将在编译后完成,但作为编译过程的一部分。例如Spring AOP@Transactional注释与AspectJ结合使用,可以在标注有注释的方法上编织事务代码。

还有许多其他用途,但它们通常分解成两类

  1. 为了降低锅炉板代码。
  2. 针对横切关注。
+0

感谢您的解释。 “Lombock项目”很有意义。但我认为@Transactional是一个“运行时间属性”。你的意思是Spring AOP对源代码执行Annotation Processing并更新代码使其成为事务性的? –

+0

[它可以,是](http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/)。严格地说,替代方案是_load time_weaving。所以当这个类被加载时。 –

1

注解处理环境有两个主要目的 - 分析和代码生成。

该分析允许您扩展java编译器的功能,分析正在编译的程序元素,可能会添加额外的约束,验证以及报告违反这些约束的错误和警告。

代码生成允许您从现有手写代码中的信号中生成额外的补充代码,主要是(但不是唯一地)键入注释。

一些例子包括Dagger,这是一个编译时分析依赖注入系统,报告错误和警告,通常在运行时找到,而不是在编译代码时发现。 Dagger还可以生成所有通常使用反射或通过手写胶水代码来完成的代码,从而提供实质性的好处(在某些情况下)以及可用于逐步调试的基础结构代码等。

另一个例子是后者评估各种针对你的代码检查,包括空安全的Checker Framework

第三个例子是Auto-Value旨在使较小的值类型几乎微不足道写。

注解处理环境决定不适合的一件事是现有代码就地变异或修改当前正在编译的代码。虽然有些项目会这样做,但他们实际上并未使用注释处理器API,而是将其转换为内部编译器类型来执行此操作。虽然这显然是可能的,但它可能很脆弱,并且可能无法可靠地从不同版本或编译器转换为编译器,因此需要对每个版本和编译器供应商进行自定义处理。