何谓注解?
Annotation
(注解) 是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信息供程序在编译或者运行时使用。
注解本质是一个继承了Annotation
的特殊接口:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
public interface Override extends Annotation{
}
JDK 提供了很多内置的注解(比如 @Override
、@Deprecated
),同时,我们还可以自定义注解。
元注解
元注解(Meta-annotation)是作用于其他注解的注解,它们提供了关于注解本身的元数据。在 Java 中,元注解用于定义注解的属性和行为,它们是注解的注解。Java 提供了四个标准的元注解,它们可以被用来注解其他注解,以提供额外的信息给编译器和开发工具,如 JavaDoc 和 IDE。
以下是 Java 中四个标准的元注解:
-
- 定义了注解的保留策略,即注解在哪个级别保留:运行时(RUNTIME)、编译时(SOURCE)或类加载时(CLASS)。
@Retention(RetentionPolicy.RUNTIME)
表示注解不仅被保留在编译后的字节码中,而且在运行时也可以通过反射被访问。@Retention(RetentionPolicy.SOURCE)
表示注解只在源代码中保留,编译时会被忽略。@Retention(RetentionPolicy.CLASS)
表示注解被保留在编译后的字节码中,但在运行时不可见。
- @Target :
-
- 定义了注解可以应用的 Java 元素类型,如类(TYPE)、方法(METHOD)、字段(FIELD)、构造函数(CONSTRUCTOR)等。
@Target(ElementType.TYPE)
表示注解可以应用于类型声明。@Target(ElementType.FIELD)
表示注解可以应用于字段声明。
-
- 指示注解将被包含在 JavaDoc 生成的文档中。
- 如果一个注解被
@Documented
标记,那么使用 Javadoc 工具时,这个注解的信息会被包含在生成的 API 文档中。
-
- 指示注解是否被子类继承。
- 默认情况下,注解不会被子类继承。如果一个注解声明了
@Inherited
,那么子类将继承父类的这个注解。
元注解的主要用途是为自定义注解提供元数据,这样编译器和工具可以识别和处理这些注解。例如,当你创建一个自定义注解时,你可能会使用 @Retention
来指定注解的保留策略,使用 @Target
来指定注解可以应用的类型,使用 @Documented
来指示这个注解应该在文档中被提及,以及使用 @Inherited
来决定注解是否应该被子类继承。
元注解是 Java 注解系统的一个重要组成部分,它们使得注解更加灵活和强大,同时也为注解的使用者提供了更多的上下文信息。
注解的解析方法有哪几种?
注解只有被解析之后才会生效,常见的解析方法有两种:
- 编译期直接扫描:编译器在编译 Java 代码的时候扫描对应的注解并处理,比如某个方法使用
@Override
注解,编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。
- 运行期通过反射处理:像框架中自带的注解(比如 Spring 框架的
@Value
、@Component
)都是通过反射来进行处理的。