注解
Java中的注解(Annotation)是一种元数据形式,用于向编译器或JVM提供有关程序元素(如类、方法、变量、参数和包)的附加信息。注解不会直接影响程序的行为或结构,但它们可以被编译器、开发工具或运行时环境用于生成代码、进行验证、执行处理或提供信息。以下是关于Java注解的几个关键点:
1. 注解的种类
1.1.内置标准注解:
@Override
:指示一个方法覆盖了超类中的方法。@Deprecated
:标记已过时的元素,建议不再使用。@SuppressWarnings
:抑制编译器警告。
1.2.元注解:给注解用的注解
用于创建自定义注解的注解,包括:
1.2.1.@Retention
:
指定注解保留策略(解析时间),如RetentionPolicy.SOURCE
(只保留在源码中)、RetentionPolicy.CLASS
(保留在class文件中)或RetentionPolicy.RUNTIME
(运行时可通过反射访问)。
1.2.1.1. SOURCE : 编译时(Compile Time)
编译时解析的注解在源代码被编译成字节码时被处理。这些注解主要用于生成额外的代码、检查代码的正确性或进行其他静态分析。例如,@Override
, @Deprecated
, 和一些编译器使用的注解如Lombok的@Data
就是在编译时期被解析的。编译器或注解处理器(如APT, Annotation Processing Tool)会读取这些注解并据此执行相应的操作。
1.2.1.2.CLASS : 类加载时(Class Load Time)
这类注解在类被加载到Java虚拟机(JVM)时被解析。例如,一些框架或库会在类加载阶段利用这些注解来配置类的行为,如Spring框架使用@Component
, @Service
, @Autowired
等注解来实现依赖注入和bean的装配,这些注解会在应用上下文初始化,即类加载时被解析和处理。
1.2.1.3.RUNTIME : 运行时(Runtime)
运行时解析的注解在应用程序运行过程中可以被读取和处理。这意味着注解信息在程序执行期间始终可用,可以通过反射API来访问这些注解。例如,@Retention(RetentionPolicy.RUNTIME)
注解的那些注解可以在程序运行时通过反射被检测到,常用于自定义注解处理、日志记录、权限控制等场景。
1.2.2.@Target
:
指定注解可以应用到哪些程序元素上。
它接受一个ElementType
类型的枚举值数组作为参数,ElementType
枚举定义了一系列可能的目标元素类型。以下是ElementType
的一些主要选项:
- ElementType.TYPE: 类、接口(包括注解类型)或枚举声明。
- ElementType.FIELD: 类或接口中的字段声明(包括枚举常量)。
- ElementType.METHOD: 类或接口中的方法声明。
- ElementType.PARAMETER: 方法参数声明。
- ElementType.CONSTRUCTOR: 类的构造函数声明。
- ElementType.LOCAL_VARIABLE: 本地变量声明。
- ElementType.ANNOTATION_TYPE: 另一个注解的声明。
- ElementType.PACKAGE: 包声明。
- ElementType.TYPE_PARAMETER: 类型参数声明(Java 8及以后版本)。
- ElementType.TYPE_USE: 任何类型使用的地方,如泛型参数、类型转换、静态成员的类型等(Java 8及以后版本)。
1.2.3.@Documented
:
指示该注解应被包含在生成的API文档中。
1.2.4.@Inherited
:
允许子类继承父类上的注解。
1.2.5.@Repeatable
:
自Java 8起,允许同一注解在同一声明上多次使用。
1.3.自定义注解:
开发者可以定义自己的注解,通过@interface
关键字实现,用于满足特定的编程需求或框架集成。
public @interface MyAnnotation {
}
1.3.1.注解的参数
定义注解参数