java-8可重复的自定义注释

Rav*_*abu 6 java annotations java-8

我知道java @Override等基本注释.

Annotations are only metadata and they do not contain any business logic.
Run Code Online (Sandbox Code Playgroud)

我将重复oracle 文档页面中的注释以了解java-8新功能.

例如,您正在编写代码以使用timer service that enables you to run a method at a given time or on a certain schedule, similar to the UNIX cron service.现在您要设置一个计时器来运行一个方法,doPeriodicCleanup在该月的最后一天以及每个星期五的晚上11:00.要设置要运行的计时器,请创建一个@Schedule注释并将其应用于doPeriodicCleanup方法两次.

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }
Run Code Online (Sandbox Code Playgroud)

声明可重复的注释类型

注释类型必须使用@Repeatable元注释进行标记.以下示例定义自定义@Schedule可重复注释类型:

import java.lang.annotation.Repeatable;

@Repeatable(Schedules.class)
public @interface Schedule {
  String dayOfMonth() default "first";
  String dayOfWeek() default "Mon";
  int hour() default 12;
}
Run Code Online (Sandbox Code Playgroud)

声明包含注释类型

包含注释类型必须具有带数组类型的value元素.数组类型的组件类型必须是可重复的注释类型.包含注释类型的计划的声明如下:

public @interface Schedules {
    Schedule[] value();
}
Run Code Online (Sandbox Code Playgroud)

我不明白@Schedules注释的使用和使用.它现在如何适用于以下方法?.

public void doPeriodicCleanup() { ... }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

JB *_*zet 10

在Java 8之前,给定的注释只能在方法(或类或字段等)上设置一次.因此,如果您希望能够在单个方法上设置两个不同的计划,则必须定义一个"包装"注释,例如Schedules包含注释数组Schedule.

开发人员因此必须做这样的事情:

@Schedules(value = {
    @Schedule(dayOfMonth="last"),
    @Schedule(dayOfWeek="Fri", hour="23")
})
Run Code Online (Sandbox Code Playgroud)

这不是非常易读,并且除了包含多个Schedule注释之外,Schedules注释没有任何其他用途.

为了减少样板,但保持注释API相同,现在允许简单地使用注释方法

@Schedule(dayOfMonth="last"),
@Schedule(dayOfWeek="Fri", hour="23")
Run Code Online (Sandbox Code Playgroud)

通过将Schedule声明为可重复并指定其"包装"注释.但它只是语法糖,导致与前面的代码相同:在运行时,该方法被视为使用包含两个Schedule的单个Schedules注释进行注释.编译器将第二段代码转换为第一段代码.