Java 8 可重复的自定义注释

2022-09-03 05:55:43

我知道Java中的基本注释,如等。@Override

Annotations are only metadata and they do not contain any business logic.

我正在从Oracle文档页面重复注释,以了解Java 8的新功能。

例如,您正在编写代码以使用“计时器服务,该服务使您能够在给定时间或按特定时间表运行方法,类似于 UNIX cron 服务”。现在,您希望设置一个计时器,以便在当月的最后一天和每个星期五晚上 11:00 运行方法 。若要将计时器设置为运行,请创建一个批注并将其应用于 doPeriodicCleanup 方法两次。doPeriodicCleanup@Schedule

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }

声明可重复的批注类型

注释类型必须使用元注释@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;
}

声明包含批注类型

包含批注类型必须具有数组类型的值元素。数组类型的组件类型必须是可重复的注释类型。包含注释类型的明细表的声明如下:

public @interface Schedules {
    Schedule[] value();
}

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

public void doPeriodicCleanup() { ... }

提前致谢。


答案 1

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

因此,开发人员必须执行如下操作:

@Schedules(value = {
    @Schedule(dayOfMonth="last"),
    @Schedule(dayOfWeek="Fri", hour="23")
})

这不是很可读,并且计划注释除了包含多个计划注释之外没有任何用途。

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

@Schedule(dayOfMonth="last"),
@Schedule(dayOfWeek="Fri", hour="23")

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


答案 2

推荐