注释类型之间的第一个主要区别是它们是在编译时使用,然后丢弃(如
@Override)还是放在已编译的类文件中并在运行时可用(如Spring的
@Component)。这由注释的@Retention策略确定。如果要编写自己的注释,则需要确定该注释在运行时(可能是用于自动配置)还是仅在编译时(用于检查或代码生成)有用。
在编译带有注释的代码时,编译器会看到注释,就像在源元素上看到其他修饰符一样,例如访问修饰符(
public/
private)或
final。当遇到注释时,它将运行一个注释处理器,就像一个插件类,它对特定的注释感兴趣。注释处理器通常使用Reflection
API来检查正在编译的元素,并且可以简单地对它们进行检查,修改它们或生成要编译的新代码。
@Override是第一个例子 它使用Reflection
API来确保它可以在其中一个超类中找到方法签名的匹配项,如果不能找到,则使用
Messager引起编译错误。
有很多关于编写注释处理器的教程。这是一个有用的。期待通过对这些方法的
Processor接口对于编译器是如何调用注释处理器;
主要操作发生在
process方法中,每次编译器看到带有匹配注释的元素时,该方法就会被调用。



