Java 注解

1. 什么是 Java 注解?
可以把 Java 注解想象成生活中的便利贴或标签。比如你有一个笔记本,里面记录了很多内容,为了方便快速找到某些重要的页面或者记住一些特殊的信息,你可以在相应的页面边缘贴上不同颜色的便利贴,每个便利贴上可以写上简单的提示,如 “重要公式”“待办事项”“疑问点” 等。在 Java 中,注解就是这样一种 “便利贴”,它可以贴在类、方法、变量等代码元素上,用来标记和说明这些元素的特性、用途或其他相关信息。
这些便利贴本身不会改变笔记本里的内容,但是它们可以帮助你更方便地组织和查找信息。同样,Java 注解也不会改变程序的语义和行为逻辑,但它可以为编译过程或运行环境提供额外的信息,从而触发特定的操作或实现特定的功能。例如,编译器可以利用注解进行语法检查、生成文档;运行时环境可以通过注解来初始化对象、管理依赖关系等。
2. Java 有哪些内置注解?
@Override:在 Java 中,@Override 注解就表示当前的方法是对父类(或接口)方法的重写,编译器会检查是否正确重写了父类的方法,如果没有正确重写,就会报错,就像家族成员发现儿子并没有按照父亲的原意去处理业务一样。
@Deprecated:假设你有一家商店,店里有一些商品因为款式过时、质量不好或者其他原因,不再推荐顾客购买,但暂时还没有完全下架。你就可以在这些商品上贴上 “不推荐购买” 的标签,同时在标签旁边写上推荐的其他替代商品。在 Java 中,@Deprecated 注解就类似于这个 “不推荐购买” 的标签,它表示被标注的元素(类、方法、字段等)已经过时,不建议使用,并且通常会提示开发人员使用其他更好的替代方案。
@SuppressWarnings:当你在家里打扫卫生时,可能会遇到一些地方比较脏或者难以清洁,在清洁过程中会产生一些灰尘或者异味,这就像是编译器在编译代码时给出的一些警告信息。有时候你可能知道这些情况是暂时无法避免的,或者你已经采取了一些措施来应对这些问题,所以不想再看到这些提醒。你就可以在显眼的地方贴上一个 “忽略清洁警告” 的纸条。在 Java 中,@SuppressWarnings 注解就是用来告诉编译器忽略某些特定的警告信息的。
3. 如何理解元注解?
元注解名称:
@Retention
功能描述: 用于指定注解的保留策略,即注解在什么阶段有效[^1^][^2^]。
取值及含义:
RetentionPolicy.SOURCE
:仅在源代码中保留,编译时会被丢弃。RetentionPolicy.CLASS
:编译后保留在 class 文件中,但在运行时会被虚拟机丢弃。RetentionPolicy.RUNTIME
:在运行时依然可见,可通过反射机制读取[^3^]。使用场景举例: 例如,一个用于测试目的的注解,只在开发阶段使用,那么可以使用
@Retention(RetentionPolicy.SOURCE)
;而像 Spring 框架中的一些注解,需要在运行时通过反射获取信息并执行相应逻辑,则使用@Retention(RetentionPolicy.RUNTIME)
[^4^]。元注解名称:
@Target
功能描述: 用于指定注解可以应用于哪些程序元素[^1^][^2^]。
取值及含义:
ElementType.TYPE
:类、接口、枚举。ElementType.FIELD
:字段、枚举常量。ElementType.METHOD
:方法。ElementType.PARAMETER
:方法参数。ElementType.CONSTRUCTOR
:构造函数。ElementType.LOCAL_VARIABLE
:局部变量。ElementType.ANNOTATION_TYPE
:注解类型。ElementType.PACKAGE
:包[^3^]。使用场景举例: 例如,定义一个只能用在方法上的注解
@MyMethodAnnotation
,使用@Target(ElementType.METHOD)
来指定其目标范围[^4^]。元注解名称:
@Documented
功能描述: 表示使用该注解的自定义注解将被 javadoc 工具提取成文档[^1^][^2^]。
取值及含义: 无特定值。
使用场景举例: 如果有一个自定义注解
@ApiDescription
,用于给 API 接口添加描述信息,并且希望这些描述在生成的文档中可见,就可以使用@Documented
元注解来标记它。元注解名称:
@Inherited
功能描述: 标记这个注解是继承于哪个注解类(默认注解并没有继承于任何子类)[^1^][^2^]。
取值及含义: 无特定值。
使用场景举例: 假设有一个基础类
BaseClass
,使用了@Inherited @MyAnnotation
注解,那么在继承自BaseClass
的SubClass
中,也会隐式地拥有@MyAnnotation
注解。
评论