框架中大量使用注解。
注解是什么?
注解(Annotation)是一种标注,可以配置参数,参数可以有默认值,如果参数名是value,则可以省略参数名称。
如何定义注解?
定义一个注解的格式如下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
用来修饰注解的注解成为 元注解 ,JDK定义好了元注解。
下面介绍比较重要的几个元注解:
@Target 用来定义注解作用于哪些位置。
ElementType.TYPE:类或接口
ElementType.FIELD:字段
ElementType.METHOD:方法
ElementType.CONSTRUCTOR:构造方法
ElementType.PARAMETER:方法参数
@Retention定义注解的生命周期
RetentionPolicy.SOURCE:编译期
RetentionPolicy.CLASS:class文件
RetentionPolicy.RUNTIME:运行期
.java 文件 —> .class文件 —> JVM加载运行,我们可以简单看作有这么三个时期。
.java 文件 —> .class文件 ,此时 RetentionPolicy.SOURCE:编译期 类型的注解已经被使用,不在.class文件中。例如@Override 为了让编译器检查我们的代码是否正确重写,检查完就不用保留了。
JVM加载运行后,就只剩 RetentionPolicy.RUNTIME:运行期 类型的注解了,一般自定义注解都是此种类型。
其中@Retention的默认值是Class,运行其反射读取的注解不能漏写@Retention(RetentionPolicy.RUNTIME)
@Inherited 定义子类是否可以继承父类的注解,仅针对@Target为TYPE类型的注解,仅对class的继承有效,对interface的继承无效。