Java注释处理 - 目的&例子

时间:2013-06-02 10:49:53

标签: java annotations apt annotation-processing

即使花了很多时间,我也无法理解注释处理的目的。

我理解为什么运行时需要注释,我能想到的最简单的例子是:

  1. 更换标记界面。
  2. 更换某种类型的市场属性(例如瞬态)
  3. 一般来说,可以在运行时完成任何有用的工作。
  4. 但遗憾的是,我无法理解在编译时使用注释的任何实际示例/原因(除了JDK提供的默认注释,例如@Override等)。

    我无法理解使用注释处理器“生成代码”的目的/需求是什么。

    编辑:Javadoc / Custom Java doc是我可以想到的一个实用程序,用于使用注释处理器。

2 个答案:

答案 0 :(得分:4)

这可以用于各种各样的事情。

两个简单的例子

  1. Lombock project。厌倦了写成千上万的getter和setter?为什么不让注释处理器在编译时执行它。
  2. AOP。您可以使用AspectJ之类的东西来编织依赖于注释的代码。这将在编译后完成,但作为编译过程的一部分。例如,Spring AOP@Transactional注释与AspectJ结合使用,以围绕使用注释标记的方法编写事务代码。
  3. 还有许多其他用途,但它们通常分为两类

    1. 减少锅炉板代码。
    2. 关于跨领域的问题。

答案 1 :(得分:1)

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

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

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

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

另一个例子是Checker Framework,它根据你的代码评估各种检查,包括空安全性等。

第三个例子是Auto-Value,旨在使小值类型几乎无关紧要。

注释处理环境明显不适合的一件事是现有代码的变异,或者当前正在编译的代码的修改。虽然有些项目是这样做的,但它们实际上并没有使用注释处理器API,而是使用内部编译器类型来实现这一点。虽然这显然是可能的,但它可能很脆弱,并且可能无法在版本之间,编译器到编译器之间可靠地工作,需要为每个版本和编译器供应商进行自定义处理。