注解介绍
元数据
元数据就是为其他数据提供信息的数据
注解
官方解释:注解用于为代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 JDK 1.5 开始添加到 Java 的。
简单的理解:注解就是附加到代码上的一种额外补充信息
注解作用
源码阶段注解: 编译器可利用该阶段注解检测错误,提示警告信息,打印日志等
编译阶段注解:利用注解信息自动生成代码、文档或者做其它相应的自动处理
运行阶段注解: 可通过反射获取注解信息,做相应操作
如何自定义定义一个注解
使用 @interface+ 注解名称这种语法结构就能定义一个注解,如下:
@interface TestAnnotation{
}
元注解
元注解就是为注解提供注解的注解
JDK 给我们提供的元注解
1、@Target
2、@Retention
3、@Inherited
4、@Documented
5、@Repeatable
@Target
@Target表示这个注解能放在什么位置上
ElementType.ANNOTATION_TYPE //能修饰注解
ElementType.CONSTRUCTOR //能修饰构造器
ElementType.FIELD //能修饰成员变量
ElementType.LOCAL_VARIABLE //能修饰局部变量
ElementType.METHOD //能修饰方法
ElementType.PACKAGE //能修饰包名
ElementType.PARAMETER //能修饰参数
ElementType.TYPE //能修饰类、接口或枚举类型
ElementType.TYPE_PARAMETER //能修饰泛型,如泛型方法、泛型类、泛型接口 (jdk1.8加入)
ElementType.TYPE_USE //能修饰类型 可用于任意类型除了 class (jdk1.8加入)
@Target(ElementType.TYPE)
@interface TestAnnotation{
}
注意:默认情况下无限制
@Retention
@Retention 表示注解的的生命周期,可选的值有 3 个:
RetentionPolicy.SOURCE //表示注解只在源码中存在,编译成 class 之后,就没了
RetentionPolicy.CLASS //表示注解在 java 源文件编程成 .class 文件后,依然存在,但是运行起来后就没了
RetentionPolicy.RUNTIME //表示注解在运行起来后依然存在,程序可以通过反射获取这些信息
@Retention(RetentionPolicy.RUNTIME)
@interface TestAnnotation{
}
注意:默认情况下为 RetentionPolicy.CLASS
@Inherited
@Inherited表示该注解可被继承,即当一个子类继承一个父类,该父类添加的注解有被 @Inherited修饰,那么子类就可以获取到该注解,否则获取不到
@Inherited
@interface TestAnnotation{
}
注意:默认情况下为不可继承
@Documented
@Documented 表示该注解在通过javadoc 命令生成Api文档后,会出现该注解的注释说明
@Documented
@interface TestAnnotation{
}
注意:默认情况下为不出现
@Repeatable
@Repeatable是JDK 1.8新增的元注解,它表示注解在同一个位置能出现多次,这个注解有点抽象,我们通过一个实际例子理解一下
//游戏玩家注解
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface GamePlayer{
Game[] value();
}
//游戏注解
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(GamePlayer.class)
@interface Game{
String gameName();
}
@Game(gameName = "CF")
@Game(gameName = "LOL"