繁体   English   中英

Java 8 可重复的自定义注解

[英]Java 8 repeatable custom annotations

我了解 Java 中的基本注释,例如@Override等。

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

我正在通过重复来自 Oracle 文档页面的注释来理解Java 8 的新特性。

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

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

声明包含的注解类型

包含的注解类型必须有一个数组类型的值元素。 数组类型的组件类型必须是可重复的注解类型。 包含注释类型的 Schedules 声明如下:

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

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

public void doPeriodicCleanup() { ... }

提前致谢。

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

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

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

这不是很容易阅读,并且 Schedules 注释除了包含几个 Schedule 注释之外没有任何其他用途。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM