@Repeatable注解表明标记的注解可以多次应用于相同的声明或类型,此注解由Java SE 8版本引入。以下示例如何使用此注解:
第一步,先声明一个重复注解类:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.Repeatable; @Repeatable(Schedules.class) public @interface Schedule { String dayOfMonth() default "first"; String dayOfWeek() default "Mon"; int hour() default 12; }
第二步,再声明一个容器注解类:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface Schedules { Schedule[] value(); }
最后,创建一个测试类:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.reflect.Method; @Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Wed", hour=24) public class RepetableAnnotation{ @Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Fri", hour=23) public void doPeriodicCleanup(){} public static void main(String[] args) throws NoSuchMethodException { Method doPeriodicCleanup = RepetableAnnotation.class.getMethod("doPeriodicCleanup"); Schedules schedules = doPeriodicCleanup.getAnnotation(Schedules.class); System.out.println("获取标记方法上的重复注解:"); for (Schedule schedule: schedules.value()){ System.out.println(schedule); } System.out.println("获取标记类上的重复注解:"); if (RepetableAnnotation.class.isAnnotationPresent(Schedules.class)){ schedules = RepetableAnnotation.class.getAnnotation(Schedules.class); for (Schedule schedule: schedules.value()){ System.out.println(schedule); } } } }
运行结果:
获取标记方法上的重复注解: @org.springmorning.demo.javabase.annotation.meta.Schedule(hour=12, dayOfMonth=last, dayOfWeek=Mon) @org.springmorning.demo.javabase.annotation.meta.Schedule(hour=23, dayOfMonth=first, dayOfWeek=Fri) 获取标记类上的重复注解: @org.springmorning.demo.javabase.annotation.meta.Schedule(hour=12, dayOfMonth=last, dayOfWeek=Mon) @org.springmorning.demo.javabase.annotation.meta.Schedule(hour=24, dayOfMonth=first, dayOfWeek=Wed)