JDK8新特性:重复注解Repeating Annotations

注解并不是什么新鲜东西了,比如spring中存在大量注解简化我们的配置。但是在JDK8之前,我们是不能使用重复注解的,即某个位置相同注解只能出现一次。



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

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TraditionalAnnoSchedule {
    int[] hour() default {0};
}
@TraditionalAnnoSchedule(hour = {0, 8, 12})
public class Target {
    public static void main(String[] args) {
        TraditionalAnnoSchedule[] annotations = Target.class.getAnnotationsByType(TraditionalAnnoSchedule.class);
        for (TraditionalAnnoSchedule each : annotations) {
            System.out.println(Arrays.toString(each.hour()));
        }
    }
}

上面是比较传统的做法,下面我们使用JDK8的重复注解特性改造下上面的注解。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Schedules {
    Schedule[] value();
}

// JDK8新增的@Repeatable
@Repeatable(Schedules.class)
public @interface Schedule {
    int hour() default 0;
}
@Schedule(hour = 0)
@Schedule(hour = 8)
@Schedule(hour = 12)
public class Target {
    public static void main(String[] args) {
        // 推荐的方式
        Schedule[] annotations = Target.class.getAnnotationsByType(Schedule.class);
        for (Schedule each : annotations) {
            System.out.println(each.hour());
        }

        // 老的方式
        Schedule[] schedules = Target.class.getAnnotation(Schedules.class).value();
        for (Schedule each : schedules) {
            System.out.println(each.hour());
        }

    }
}


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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值