Java 8新特性 - (5)重复注解

分享到:

在JDK8之前,不能使用重复注解的,即某个位置相同注解只能出现一次。

如果想编写一个定时任务的注解,使用者可以配置在每天哪一小时触发,而且允许用户配置多个时间。传统做法是:

 1@Target(ElementType.TYPE)
 2@Retention(RetentionPolicy.RUNTIME)
 3public @interface TraditionalAnnoSchedule {
 4    int[] hour() default {0};
 5}
 6
 7@TraditionalAnnoSchedule(hour = {0, 8, 12})
 8public class Target {
 9    public static void main(String[] args) {
10        TraditionalAnnoSchedule[] annotations = Target.class.getAnnotationsByType(TraditionalAnnoSchedule.class);
11        for (TraditionalAnnoSchedule each : annotations) {
12            System.out.println(Arrays.toString(each.hour()));
13        }
14    }
15}

使用JDK8的重复注解特性改造一下。

 1@Target(ElementType.TYPE)
 2@Retention(RetentionPolicy.RUNTIME)
 3public @interface Schedules {
 4    Schedule[] value();
 5}
 6 
 7// JDK8新增的@Repeatable
 8@Repeatable(Schedules.class)
 9public @interface Schedule {
10    int hour() default 0;
11}
12
13@Schedule(hour = 0)
14@Schedule(hour = 8)
15@Schedule(hour = 12)
16public class Target {
17    public static void main(String[] args) {
18        // 推荐的方式
19        Schedule[] annotations = Target.class.getAnnotationsByType(Schedule.class);
20        for (Schedule each : annotations) {
21            System.out.println(each.hour());
22        }
23 
24        // 老的方式
25        Schedule[] schedules = Target.class.getAnnotation(Schedules.class).value();
26        for (Schedule each : schedules) {
27            System.out.println(each.hour());
28        }
29 
30    }
31}

这里有个使用@Repeatable( Schedules.class )的注解类Schedule,Schedules仅仅是Schedule注解的数组,但Java编译器并不想让程序员意识到Schedules的存在。这样对使用者而言,Target就拥有了两个Schedule注解,而不是1个Schedules注解。同时,反射相关的API提供了新的函数getAnnotationsByType()来返回重复注解的类型。


参考: