元注解知识小结
# 元注解知识小结
注解官方解释:
从 JDK5 开始,Java 增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
# 元注解
元注解(Meta-Annotation)又叫做注解的注解,用于描述其他注解的行为,其实就是对该注解的一些解释说明。
- 例如它们的作用范围、生存周期等。
- 例如我们买的演唱会门票,上面标注的有时间、地点、座位等。
常见的元注解有:
@Target
(指定注解作用范围)@Retention
(指定注解的生命周期)@Documented
(指定是否生成 Javadoc)@Inherited
(指定是否允许子类继承)
# @Target 注解
@Target 表示该注解作用的位置,里面的变量是一个枚举。
- 限定 这个注解可以标注到类、方法、字段、参数等的哪些位置。它的参数是
ElementType
枚举。
ElementType.TYPE
:作用在类、接口或枚举上面(常用)ElementType.FIELD
:作用在成员变量上面ElementType.METHOD
:作用在方法上面(常用)ElementType.PARAMETER
:作用在方法参数上面(常用)ElementType.CONSTRUCTOR
:作用在构造器上面ElementType.LOCAL_VARIABLE
:作用在局部变量上面ElementType.ANNOTATION_TYPE
:作用在注解上面ElementType.PACKAGE
:作用在包上面
表格描述:
ElementType | 作用范围 | 常见应用 |
---|---|---|
TYPE | 类、接口、枚举 | @Component 、@Service |
FIELD | 成员变量 | @Autowired 、@Value |
METHOD | 方法 | @PostConstruct 、@RequestMapping |
PARAMETER | 方法参数 | @RequestParam 、@PathVariable |
CONSTRUCTOR | 构造方法 | 用于依赖注入 |
LOCAL_VARIABLE | 局部变量 | 一般不用 |
ANNOTATION_TYPE | 另一个注解 | 自定义注解 |
PACKAGE | 包 | package-info.java |
写法示例:
@Target({ElementType.METHOD, ElementType.FIELD}) // 只能作用于方法和字段
public @interface MyAnnotation {
}
1
2
3
2
3
# @Retention 注解
@Retention 表示该注解的使用时间,里面的变量是一个枚举。
- 决定注解的生命周期,即它存在在哪个阶段。
RetentionPolicy.SOURCE
:表示该注解在源码阶段时会被用到RetentionPolicy.CLASS
:表示该注解在程序编译时会被用到RetentionPolicy.RUNTIME
:表示该注解在程序运行时会被用到,我们在实际开发中也经常使用该变量。
表格描述:
RetentionPolicy | 生命周期 | 应用场景 |
---|---|---|
SOURCE | 仅存在于源码,编译后丢弃 | @Override 、@SuppressWarnings |
CLASS | 存在于编译后的 .class 文件,运行时丢弃 | @Deprecated |
RUNTIME | 运行时 依然保留,可用反射读取 | @Autowired 、@RequestMapping |
写法示例:
@Retention(RetentionPolicy.RUNTIME)
1
# @Documented 注解
@Documented 指定该注解是否包含在 Javadoc 文档中。
写法示例:
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface API {
String value();
}
1
2
3
4
5
6
2
3
4
5
6
如果 @API
没有 @Documented
,那么 javadoc
生成的文档不会包含它。
# @Inherited 注解
@Inherited
允许子类继承父类的注解(但接口的注解不会被继承)。
写法示例:
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface ParentAnnotation {}
@ParentAnnotation
class Parent {}
class Child extends Parent {} // Child 也会有 @ParentAnnotation
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
@Inherited
只对类生效,不适用于方法、字段。
# 小结
元注解 | 作用 | 适用范围 |
---|---|---|
@Target | 指定注解可用于类、方法、字段等 | ElementType 枚举 |
@Retention | 指定注解的生命周期 | SOURCE 、CLASS 、RUNTIME |
@Documented | 指定注解是否生成 Javadoc | API 文档 |
@Inherited | 允许子类继承父类的注解 | 仅限于类 |
这些元注解可以配合使用,例如:
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
}
1
2
3
4
5
6
2
3
4
5
6
# 学习参考
上次更新: 2025/3/20 16:42:28