1. 注解 @Override
的定义是
1 | @Target(ElementType.METHOD) |
2. 注解 @SuppressWarnings
的定义是
1 | @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) |
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
提供值 - 注解内参数的类型不是什么都可以的,合法的类型有:基本类型、
String
、Class
、枚举、注解,以及这些类型的数组 - 参数定义时可以使用
default
指定一个默认值