0%

Java 注解(三):创建注解

1. 注解 @Override 的定义是

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

}

2. 注解 @SuppressWarnings 的定义是

1
2
3
4
5
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}

3. 怎样创建一个注解

  • 在注解名前加上 @interface 修饰
  • 有两个元注解@Target@Retention,专门用于定义注解本身
    • @Target:表示注解的作用目标
    • @Retention:表示注解信息保留到什么时候

4. 怎样理解元注解 @Target

  • @Target 表示注解的作用目标,比如 @Override 的目标是方法(ElementType.METHOD

  • ElementType 是一个枚举,主要可选值有

    • TYPE:表示类、接口(包括注解)、或者枚举声明
    • FIELD:字段,包括枚举常量
    • METHOD:方法
    • PARAMETER:方法中的参数
    • CONSTRUCTOR:构造方法
    • LOCAL_VARIABLE:本地变量
    • MODULE:模块(Java 9 引入的)
  • 目标可以有多个,用 {} 表示

  • 如果没有声明 @Target,则默认为适用于所有类型

5. 怎样理解元注解 @Retention

  • @Retention 表示注解信息保留到什么时候,取值只能有一个,类型为 RetentionPolicy

  • RetentionPolicy 也是一个枚举,有三个取值

    • SOURCE:只在源代码中保留,编译器将代码编译为字节码文件后就会丢掉
    • CLASS:保留到字节码文件中,但 JVM 将 class 文件加载到内存时不一定会在内存中保留
    • RUNTIME:一直保留到运行时
  • 如果没有声明 @Retention,则默认CLASS

  • @Override@SuppressWarnings 都是给编译器用的,所以 @Retention 都是 RetentionPolicy.SOURCE

6. 怎样为注解定义参数

  • 定义的方式是在注解内定义一些方法。比如 @SuppressWarnings 内定义的方法 value,返回值类型表示参数的类型,这里是 String[]。使用 @SuppressWarnings 时必须给 value 提供值
  • 注解内参数的类型不是什么都可以的,合法的类型有:基本类型、StringClass、枚举、注解,以及这些类型的数组
  • 参数定义时可以使用 default 指定一个默认值
-------------------- 本文结束感谢您的阅读 --------------------