java遗珠之重复注解

Posted 吴冬冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java遗珠之重复注解相关的知识,希望对你有一定的参考价值。

重复注解

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

我来看个定时执行的代码

@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);
            
        
    

以上是关于java遗珠之重复注解的主要内容,如果未能解决你的问题,请参考以下文章

java遗珠之多异常

java遗珠之前言

java遗珠之@SafeVarargs

java遗珠之协变返回类型

java遗珠之异常种类

java遗珠之异常种类