Java 8 可重复的自定义注解

标签 java annotations java-8

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

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

我正在查看来自 Oracle 的重复注释 documentation了解 Java 8 新功能的页面。

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

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

声明一个可重复的注解类型

The annotation type must be marked with the @Repeatable meta-annotation. The following example defines a custom @Schedule repeatable annotation type:

import java.lang.annotation.Repeatable;

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

声明包含的注解类型

The containing annotation type must have a value element with an array type. The component type of the array type must be the repeatable annotation type. The declaration for the Schedules containing annotation type is the following:

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

关于Java 8 可重复的自定义注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951519/

相关文章:

java - 自定义类加载/覆盖 Android 原生类

用于 IOT 项目的多个服务器通信的 Java 单客户端线程

数组上的 Java 注释目标 ElementType.TYPE_USE

java - @OrderBy 在 JPA 中无法正常工作

python re.X vs automagic 行延续

java - 什么决定了从 lambda 创建哪个功能接口(interface)?

java - 访问 axis webservice 时没有为 org.apache.commons.logging.LogFactory 定义实现

下游的 Java 8 Collector.groupingBy 分类器值

java - 如何将字符串文本添加到 orElse 和 .map

java - 使用自上而下的方法在 Java 中设计 API - 编写 Javadoc 是最好的起点吗?