注解的效果/行为的实现在哪里?

问题描述 投票:0回答:1

根据我的理解,注释就是元数据。它将在编译时或运行时完成其工作。

考虑注释

@Override
,它确保在超类/接口中定义方法并且我将覆盖它。如果不是,编译器会抛出错误。我的问题是,关于此检查的实际业务逻辑写在哪里? 这里我假设,它应该在
javac
编译器中编写,因为此注释是
java.base
模块的一部分。

但是像

@PostConstruct
(来自javax.annotation)和
@Getter
(来自Lombok)这样的注释呢?这些是作为 JAR 依赖项添加的注释。我正在搜索它的实现,但没有找到它。比如
@PostConstruct
逻辑是如何调用的?如何调用
@Getter
并创建字段的 getter 方法并将其嵌入到
.class
文件中?

换句话说,我在哪里可以找到驱动注释行为的底层机制?

java annotations
1个回答
4
投票

没有单一的底层机制来驱动注释的行为。

  • 一些编译时注释是由编译器本身实现的。 从 Java 21 开始,这些是
    @Target
    @Retention
    @Inherited
    @Override
    @SuppressWarnings
    @Deprecated
    @SafeVarargs
    @Repeatable
    @FunctionalInterface
  • 其他编译时注释由自定义注释处理器处理。
  • 一些注释是在字节码编译和运行时之间的“字节码编织”步骤中处理的。 这通常需要一些工具读取类文件并修改它们的字节码。
  • 一些注释是在运行时处理的,或者在类加载期间,使用检测 API 或通过其他方式。 例如,用户或库代码可以使用反射来检索类的运行时注释,并根据其发现的内容以某种方式修改应用程序行为。

此外,某些注释实际上并不具有行为效果。 例如,有些用于驱动静态代码分析器,其目的是在应用程序中的错误发生之前识别它们。 例如,如果方法参数声明为

@NotNull
,则静态分析器可能能够识别使用可能为空参数调用该方法的位置。

那么...实现该行为的代码在哪里? 这取决于注释。 对于

@Override
它将位于 javac 代码库中,
@PostConstruct
- Spring 代码库,
@Getter
- Lombok 代码库,依此类推。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.