注解
- 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
- 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
JAVA提供的基本注解
@Override
- 限定重写父类方法。对于子类中被@Override 修饰的方法,如果存在对应的被重写的父类方法,则正确;如果不存在,则报错。@Override 只能作用于方法,不能作用于其他程序元素
@Deprecated
- 用于表示某个程序元素(类、方法等)已过时。如果使用了被@Deprecated修饰的类或方法等,编译器会发出警告,一般来说,加了@Deprecated的接口,必须在该接口的注释上加上替换的新接口并说明废弃原因,变更之后要进行单元测试,接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么
@SuppressWarnings
- 抑制编译器警告
@SafeVarargs
是JDK 7 专门为抑制"堆污染"警告提供的
堆污染:简单的说就是当一个泛型类型变量赋值给不是泛型类型变量,这种错误在编译期间能被编译器警告,但是可以忽略,直到运行时报错
@FunctionalIterface
- @FunctionalInterface就是用来指定某个接口必须是函数式接口,否则就会编译出错
自定义注解
元注解
public @interface 注解名称{
属性列表;
}
属性的返回值类型有下列取值:
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
元注解
用于注解的注解
@Target:描述注解能够作用的位置
ElementType取值:
- TYPE:可以作用于类上
- METHOD:可以作用于方法上
- FIELD:可以作用于成员变量上
- ...
@Retention:描述注解被保留的阶段
public enum RetentionPolicy {
// 保留在源码级别上
SOURCE,
//保留在class文件中,jvm无法读取到
CLASS,
//会保留到class字节码文件中,并被JVM读取到
RUNTIME
}
- @Documented:描述注解是否被抽取到api文档中
- @Inherited:描述注解是否被子类继承
- 父类的注解将会传递到子类上
- @Repeatable:描述是否能重复注解(JDK8之后新增的功能)
- 实现细节:通过一个注解容器
注解的解析
- RetentionPolicy.RUNTIME :注解在class文件中,被JVM加载,可用反射解析注解
- RetentionPolicy.CLASS:注解在class文件中,但JVM没有加载,只能采用字节码工具进行特殊处理
- RetentionPolicy.SOURCE :注解在java文件中,不在class文件中,也不会被JVM加载
- 只有在源码级别进行注解处理
- Java提供注解处理器来解析带注解的源码,产生新的文件
RUNTIME注解本质
- 继承Annotation接口的一个接口
- 实际使用中有一个代理对象实现了此接口
- 代理对象使用AnnotationInvocationHandler处理方法调用
- AnnotationInvocationHandler使用一个map存储属性
应用
- Servlet3.0
- Junit
- Spring & Spring boot
- Lombok