java遗珠之重复注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lastsweetop/article/details/82868378

重复注解

有时候你需要相同的注解在同一种类型或者定义上,这时候重复注解就发挥作用了。

我来看个定时执行的代码

@Component
public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedDelay = 1500)
    @Scheduled(fixedRate = 1000)
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}

一个定时任务按照两种规则执行,一种是一个任务执行完延迟1500ms执行另一个,另一个是1000ms执行一个任务,不管其他任务有没有执行完毕。

因着兼容的原因,重复注解被存在一个由编译自动生成的注解容器中,为了能让编译器做到如此,需要两步操作

1.定义重复注解类型

省略一些无关的元素,注解类型必须使用 @Repeatable
元注解类型,

@Repeatable(Schedules.class)
public @interface Scheduled {
}

@Repeatable
的括号里是存放注解的容器的类型,注解 @Scheduled
存放在注解 @Schedules
中。

2.定义包含注解的类型

包含注解的类型必须有个数组类型的value元素,数组的类型必须是重复注解的类型。

public @interface Schedules {

	Scheduled[] value();

}

检索注解

Reflection Api中有检索注解的api,对于重复注解需要使用 AnnotatedElement.getAnnotationsByType(Class<T> annotationClass)

代码如下:

public static void main(String[] args) {
        Method[] methods = ScheduledTasks.class.getDeclaredMethods();
        for (Method method : methods) {
            Scheduled[] scheduleds = method.getAnnotationsByType(Scheduled.class);
            for (Scheduled scheduled : scheduleds) {
               System.out.println(scheduled);
            }
        }
    }

原文 

https://blog.csdn.net/lastsweetop/article/details/82868378

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » java遗珠之重复注解

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址