抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了注解的概念和使用。

环境

Windows 10 企业版 LTSC 21H2
Java 1.8

1 定义

从JDK1.5开始,增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

2 分类

按运行机制分类:

  • 源码注解,这种注解只在源码阶段存在存在。
  • 编译注解,注解不但在源码中存在,而且在class文件中也存在,JDK自带的注解就是属于这种类型的注解。
  • 运行时注解,即便到在运行阶段仍然起作用的注解,第三方提供的注解大部分是属于这种类型的注解。

按来源分类:

  • JDK自带的注解。
  • 第三方的注解。
  • 自定义注解。

按功能分类:

  • 普通注解,对程序和代码进行标注的注解。
  • 元注解,对注解标记的注解。

3 常见注解

JDK自带注解:

  • @Override:表示覆盖或重写父类的方法。
  • @Deprecated:表示该方法已经过时了,不建议使用。
  • @SuppressWarnings:表示忽略指定警告。

第三方注解:

  • @AutoWired:Spring框架中的注解。

自定义注解:

  • 开发者自己定义的注解。

4 元注解

元注解的作用就是负责注解其他注解。

4.1 @Target

用于描述注解的使用范围,即被描述的注解可以用在什么地方。

取值:

  • ElementType.PACKAGE:包。
  • ElementType.TYPE:接口、类、枚举。
  • ElementType.FIELD:字段、枚举的常量。
  • ElementType.METHOD:方法。
  • ElementType.PARAMETER:方法参数。
  • ElementType.CONSTRUCTOR:构造函数。
  • ElementType.LOCAL_VARIABLE:局部变量。
  • ElementType.ANNOTATION_TYPE:注解。

4.2 @Retention

用于描述注解的生命周期,即被描述的注解在什么范围内有效。

取值:

  • RetentionPolicy.SOURCE:注解仅存在于源码中,在class字节码文件中不包含。
  • RetentionPolicy.CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。
  • RetentionPolicy.RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到。

4.3 @Inherited

用于说明这个注解是可以被继承的。如果父类使用了@Inherited注解,则其子类也会使用这个注解。

4.4 @Documented

用于描述注解可以被放到文档里。

5 自定义注解

使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

自定义注解的每一个方法实际上是声明了一个配置参数,方法的名称就是参数的名称,返回值类型就是参数的类型,并且只能是基本类型/Class/String/Enum。

可以通过default来声明参数的默认值。

语法:

java
1
2
3
4
public @interface 注解名称 {
// 若干参数
修饰符 类型 名称() default 默认值;
}

说明:

  • 修饰符:只能用public或默认(default)这两个访问权限修饰符。
  • 类型:只能用byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、Annotations等数据类型,以及这一些类型的数组。
  • 名称:可以自定义,如果只有一个参数成员,最好把参数名称设为value,不要忘了后加小括号。
  • 默认值:注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,通常使用空字符串或0作为默认值。

编写自定义注解:

java
1
2
3
4
5
6
7
8
9
@Target({ElementType.METHOD, ElementType.PACKAGE, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@Documented
@Inherited
public @interface TestAnnotation {
public String value() default "";
public String name();
public int age();
}

使用自定义注解:

java
1
2
3
4
5
6
@TestAnnotation(age = 0, name = "")
public class Demo {
public static void main(String[] args) {
System.out.println();
}
}

评论