Java 注解

什么是注解?

Annotation (注解) 是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信息供程序在编译或者运行时使用。

基本介绍

  1. 注解也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
  2. 使用 Annotation 时要在前面加@符号,并把该 Annotation 当成一个修饰符使用,用于修饰它支持的程序元素。
  3. 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
  4. 在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。
  5. 在JavaEE中则占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

注解本质是一个继承了Annotation 的特殊接口:

1
2
3
4
5
6
7
8
9
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {

}

public interface Override extends Annotation{

}

JDK 提供了很多内置的注解,同时,我们还可以自定义注解。

注解只有被解析之后才会生效,常见的解析方法有两种:

  • 编译期直接扫描:编译器在编译 Java 代码的时候扫描对应的注解并处理,比如某个方法使用@Override注解,编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。
  • 运行期通过反射处理:像框架中自带的注解(比如 Spring 框架的@Value,@Component)都是通过反射来进行处理的。

三个基本的注解(修饰代码的注解)

  • @Override:限定某个方法 是重写父类方法,该注解只能用于方法
  • @Deprecated:用于表示某个程序元素(类、方法等)已过时
  • @SuppressWarnings:抑制编译器警告

@Override

使用说明

  1. @Override表示指定重写父类的方法(从编译层面验证),如果注解了没有重写则会报错。

  2. 重写的方法不写@Override注解,仍然构成重写。

  3. @Override只能修饰方法,不能修饰其他类、包、属性等。(查看源码可知: @Target(ElementType.METHOD)

  4. @Target是修饰注解的注解,称为元注解。

@Deprecated

使用说明

  1. 用于表示某个程序元素已过时(被标记的元素调用时显示为删除线)

  2. 可以修饰构造器、字段、局部变量、方法、包、参数、类。(查看源码:@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})

  3. @Deprecated的作用可以做到新旧版本的兼容和过渡。

@SuppressWarnings

使用说明

  1. 当不希望看到这些警告时,可以使用 SuppressWarnings注解来抑制警告信息
  2. 在{“”}中,可以指定你希望抑制(不显示)警告信息
all抑制所有警告
boxing抑制装箱、拆箱操作时候的警告
cast抑制映射相关的警告
dep-ann抑制启用注释的警告
deprecation抑制过期方法警告
fallthrough抑制在 switch 中缺失 breaks 的警告
finally抑制 finally 模块没有返回的警告
hiding抑制相对于隐藏变量的局部变量的警告
incomplete-switch忽略不完整的 switch 语句
nls忽略非 nls 格式的字符
null忽略对 null 的操作
rawtypes使用 generics 时忽略没有指定相应的类型
restriction抑制禁止使用劝阻或禁止引用的警告
serial忽略在 serializable 类中没有声明 serialVersionUID 变量
static-access抑制不正确的静态访问方式警告
synthetic-access抑制子类没有按最优方法访问内部类的警告
unchecked抑制没有进行类型检查操作的警告
unqualified-field-access抑制没有权限访问的域的警告
unused抑制没被使用过的代码的警告

元注解(修饰注解的注解)

  • @Retention - 指定注解的作用范围:SOURCE,CLASS,RUNTIME(标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问)
  • @Target - 标记这个注解应该是哪种 Java 成员。(可以在哪些地方使用)
  • @Documented - 标记这些注解是否包含在javadoc(用户文档)中。
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

@Retention

用于修饰注解定义,用于指定该注解可以保留多长时间。

SOURCE:编译器使用后,直接丢弃这种策略的注释(当编译器编译时生效,不会写入到class 文件,也不会再 runtime (运行时)生效。)

CLASS:默认值。编译器将把注解记录在 class 文件中。当运行 Java 程序时,JVM 不会保留注解。

RUNTIME:编译器将把注解记录在 class 文件中。当运行 Java 程序时,JVM 会保留注解。程序可以通过反射获取该注解。

@Target

用于修饰注解定义,用于指定被修饰的注解可修饰哪些程序元素

@Documented

用于指定被修饰的注解类将被 javadoc 工具提取成文档,即在生成文档时,可以看到该注解。

定义为Documented的注解必须设置Retention值为RUNTIME

@Inherited

被它修饰的注解将具有继承性,如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解。


Java 注解
https://blog-21n.pages.dev/2022/06/28/Java-注解/
作者
Neo
发布于
2022年6月28日
许可协议