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