即使花了很多时间,我也无法理解注释处理的目的。
我理解为什么运行时需要注释,我能想到的最简单的例子是:
但遗憾的是,我无法理解在编译时使用注释的任何实际示例/原因(除了JDK提供的默认注释,例如@Override等)。
我无法理解使用注释处理器“生成代码”的目的/需求是什么。
编辑:Javadoc / Custom Java doc是我可以想到的一个实用程序,用于使用注释处理器。
答案 0 :(得分:4)
这可以用于各种各样的事情。
两个简单的例子
@Transactional
注释与AspectJ结合使用,以围绕使用注释标记的方法编写事务代码。还有许多其他用途,但它们通常分为两类
答案 1 :(得分:1)
注释处理环境有两个主要目的 - 分析和代码生成。
该分析允许您扩展java编译器的功能,在编译时分析程序元素,可能会添加其他约束,验证以及报告错误和警告以防止违反这些约束。
代码生成允许您从现有手写代码中的信号生成其他补充代码,主要(但不是唯一地)键入注释。
一些示例包括Dagger,这是一个用于编译时分析的依赖项注入的系统,报告通常在运行时发现的错误和警告,而不是在编译代码期间。 Dagger还生成通常使用反射完成的所有代码,或者通过手工编写胶水代码,提供实质性的性能优势(在某些情况下)以及可用于逐步调试的基础结构代码等。
另一个例子是Checker Framework,它根据你的代码评估各种检查,包括空安全性等。
第三个例子是Auto-Value,旨在使小值类型几乎无关紧要。
注释处理环境明显不适合的一件事是现有代码的变异,或者当前正在编译的代码的修改。虽然有些项目是这样做的,但它们实际上并没有使用注释处理器API,而是使用内部编译器类型来实现这一点。虽然这显然是可能的,但它可能很脆弱,并且可能无法在版本之间,编译器到编译器之间可靠地工作,需要为每个版本和编译器供应商进行自定义处理。