根据我的理解,注释就是元数据。它将在编译时或运行时完成其工作。
考虑注释
@Override
,它确保在超类/接口中定义方法并且我将覆盖它。如果不是,编译器会抛出错误。我的问题是,关于此检查的实际业务逻辑写在哪里? 这里我假设,它应该在 javac
编译器中编写,因为此注释是 java.base
模块的一部分。
但是像
@PostConstruct
(来自javax.annotation)和@Getter
(来自Lombok)这样的注释呢?这些是作为 JAR 依赖项添加的注释。我正在搜索它的实现,但没有找到它。比如@PostConstruct
逻辑是如何调用的?如何调用 @Getter
并创建字段的 getter 方法并将其嵌入到 .class
文件中?
换句话说,我在哪里可以找到驱动注释行为的底层机制?
没有单一的底层机制来驱动注释的行为。
@Target
、@Retention
、@Inherited
、@Override
、@SuppressWarnings
、@Deprecated
、@SafeVarargs
、@Repeatable
和 @FunctionalInterface
此外,某些注释实际上并不具有行为效果。 例如,有些用于驱动静态代码分析器,其目的是在应用程序中的错误发生之前识别它们。 例如,如果方法参数声明为
@NotNull
,则静态分析器可能能够识别使用可能为空参数调用该方法的位置。
那么...实现该行为的代码在哪里? 这取决于注释。 对于
@Override
它将位于 javac 代码库中,@PostConstruct
- Spring 代码库,@Getter
- Lombok 代码库,依此类推。
另请参阅: