JAVA核心知识点--元注解详解
📚博客主页:代码探秘者
✨专栏:《JavaSe》 其他更新ing…
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
文章目录
- 一、@Target:定义注解可应用的位置
- 常用取值(来自 `java.lang.annotation.ElementType` 枚举):
- 示例:
- 二、@Retention:定义注解的生命周期(保留策略)
- 可选值(来自 `java.lang.annotation.RetentionPolicy` 枚举):
- 示例:
- 三、@Documented:是否包含在 Javadoc 中
- 说明:
- 示例:
- 四、@Inherited:注解是否可以被子类继承
- 说明:
- 示例:
- 五、组合使用的例子
- 小结
元注解(Meta-Annotation)用于定义注解行为,它们本身是注解,用来修饰“注解类”。下面我详细介绍一下常见元注解以及它们可以填写的值(即 参数或枚举类型的取值):
一、@Target:定义注解可应用的位置
常用取值(来自 java.lang.annotation.ElementType
枚举):
值 | 含义 |
---|---|
TYPE | 类、接口、枚举、注解类 |
FIELD | 字段(成员变量) |
METHOD | 方法 |
PARAMETER | 方法参数 |
CONSTRUCTOR | 构造方法 |
LOCAL_VARIABLE | 局部变量 |
ANNOTATION_TYPE | 注解类型(用于元注解) |
PACKAGE | 包 |
TYPE_PARAMETER (Java 8+) | 类型参数(泛型中的 T、E 等) |
TYPE_USE (Java 8+) | 所有使用类型的地方,如泛型、强转、变量声明等 |
示例:
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation {}
二、@Retention:定义注解的生命周期(保留策略)
可选值(来自 java.lang.annotation.RetentionPolicy
枚举):
值 | 含义 |
---|---|
SOURCE | 仅在源码中保留,编译后丢弃(如 @Override) |
CLASS | 编译期保留在 class 文件中,运行时不可读取(默认) |
RUNTIME | 运行时可通过反射读取(框架中最常用) |
示例:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}
三、@Documented:是否包含在 Javadoc 中
说明:
- 没有参数。
- 加上这个注解,表示该注解使用时会被包含在生成的 Javadoc 中。
示例:
@Documented
public @interface MyAnnotation {}
四、@Inherited:注解是否可以被子类继承
说明:
- 没有参数。
- 仅适用于类(
@Target(ElementType.TYPE)
); - 如果某个类用注解 A 标注了,子类也会“继承”这个注解(通过
getAnnotation()
可获取)。
示例:
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}
五、组合使用的例子
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {String value() default "";
}
小结
元注解 | 参数类型或可选值 |
---|---|
@Target | ElementType 枚举:TYPE , FIELD , METHOD , … |
@Retention | RetentionPolicy 枚举:SOURCE , CLASS , RUNTIME |
@Documented | 无参数 |
@Inherited | 无参数,仅作用于类注解 |