注解的类型
预定义的注解
1. 用于语言的注解
| 注解名 | 注解含义 |
|---|---|
| @Deprecated | 方法已弃用 |
| @Override | 重写父类方法 |
| @SuppressWarnings | 阻断警告提示 |
| @SafeVarargs | 声明代码存在不安全的操作 |
| @FunctionalInterface | 函数式接口声明 |
2. 用于注解的注解
| 注解名 | 注解含义 | 可选值 |
|---|---|---|
| @Retention | 说明注解保留到什么阶段 | RetentionPolicy.SOURCE, RetentionPolicy.CLASS , RetentionPolicy.RUNTIME |
| @Documented | 表明注解要被记录到 Javadoc 文档中 | 注解默认是不记录到 Javadoc |
| @Target | 表明被标注该注解的注解可以用在什么地方 | ElementType.ANNOTATION_TYPE , ElementType.CONSTRUCTOR , ElementType.FIELD , ElementType.LOCAL_VARIABLE , ElementType.METHOD ,ElementType.PACKAGE, ElementType.PARAMETER , ElementType.TYPE |
| @Inherited | 表明子类可以用父类继承注解类型 | -- |
| @Repeatable | 表明注解为重复注解 | 可多次使用到同一个位置 |
自定义的注解
注解的声明
1. 声明一个重复注解
1.1 必须要使用 @Repeatable 元注解,如下
import java.lang.annotation.Repeatable;
@Repeatable(Schedules.class) // 需要使用容器来存放多个注解,所以要包含注解类 Schedules
public @interface Schedule {
String dayOfMonth() default "first";
String dayOfWeek() default "Mon";
int hour() default 12;
}
1.2 需要声明一个容器注解类,如
public @interface Schedules {
Schedule[] value();
}
注解的设计
注意事项
- 注意注解的可使用次数
- 如标记了
@Repeatable的注解允许使用两次及两次以上;没有标记@Repeatable则最多允许使用一次
- 如标记了
- 注意注解的使用范围
- 如标记了
@Target( {ElementType.METHOD, ElementType.FIELD} )的注解,即只可在方法或属性上使用该注解
- 如标记了
注解的变化
分界版本
- Java SE 8 之前
- 只可以用在声明上
- 没有提供类型检查框架
- Java SE 8 之后
-
几乎可用在任何类型上
-
允许编写类型检查框架,如西雅图华盛顿大学的类型检查框架
- 常用于校验框架,如 @NonNull 检查 NullPointerException
-
允许使用重复注解,如:
@Schedule(dayOfMonth="last") // 第一次指定了是月的那一天 @Schedule(dayOfWeek="Fri", hour="23") // 第二次指定了星期几和什么时候 public void doPeriodicCleanup() { ... }
-
检索注解
注解的获取
-
使用反射机制取得类的单个注解,如
AnnotatedElement.getAnnotation(Class<T>) -
取得类的所有注解,如
AnnotatedElement.getAnnotationsByType(Class<T>) -
更多关于
AnnotatedElement的方法可查阅 AnnotatedElement