自定义注解
注解的格式
我们从常见的@Override来看一**解的格式
通过观察我们发现注解的内部格式是由两部分组成的
- 元注解(就是上面代码中的前2行)
- public @interface 注解名{属性列表}
注解的本质
通过查看@Override我们已经知道了注解组成。你是否会对public @interface Override {
}感到奇怪呢,这玩意儿看着既陌生又熟悉。
为什么既陌生又熟悉呢?我们如果把@去掉这就是一个名称为Override的一个接口了。可是这样@在这里放着,它还是接口吗?
我们对其反编译一下来看看它究竟是什么
建立一个.java文件,输入以下内容
使用javac命令进行编译
使用javap命令来反编译
反编译后的结果
public interface Override extends java.lang.annotation.Annotation {
}
从反编译后的结果我们可以看到**注解本质上就是一个接口,该接口默认继承Annotation接口**
注解中定义的属性
上面我们可以看到注解的本质就是一个接口,那么注解中的属性其实就是接口中定义的抽象方法。
属性的返回值类型有下列取值:
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
定义了属性,在使用时需要给属性赋值:
- 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
- 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
- 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
元注解
用于描述注解的注解
需要掌握的四个注解:
- @Target:描述注解能够作用的位置
ElementType取值:
* TYPE:可以作用于类上
* METHOD:可以作用于方法上
* FIELD:可以作用于成员变量上 - @Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到 - @Documented:描述注解是否被抽取到api文档中
- @Inherited:描述注解是否被子类继承