简体   繁体   English

Java 8 可重复的自定义注解

[英]Java 8 repeatable custom annotations

I know about basic annotations in Java like @Override etc.我了解 Java 中的基本注释,例如@Override等。

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

I am going through repeating annotations from Oracle documentation page to understand Java 8 new feature.我正在通过重复来自 Oracle 文档页面的注释来理解Java 8 的新特性。

For example, you are writing code to use a " timer service that enables you to run a method at a given time or on a certain schedule, similar to the UNIX cron service ".例如,您正在编写代码以使用“计时器服务,该服务使您能够在给定时间或按特定时间表运行方法,类似于 UNIX cron 服务”。 Now you want to set a timer to run a method, doPeriodicCleanup , on the last day of the month and on every Friday at 11:00 pm To set the timer to run, create an @Schedule annotation and apply it twice to the doPeriodicCleanup method.现在你想设置一个计时器来运行一个方法doPeriodicCleanup ,在这个月的最后一天和每个星期五晚上 11:00 要设置计时器运行,创建一个@Schedule注释并将它应用到 doPeriodicCleanup 方法两次.

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

Declare a Repeatable Annotation Type声明一个可重复的注释类型

The annotation type must be marked with the @Repeatable meta-annotation.注释类型必须用@Repeatable 元注释标记。 The following example defines a custom @Schedule repeatable annotation type:以下示例定义了自定义 @Schedule 可重复注释类型:

import java.lang.annotation.Repeatable;

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

Declare the Containing Annotation Type声明包含的注解类型

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:包含注释类型的 Schedules 声明如下:

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

I did not understand use and usage of @Schedules annotation.我不明白@Schedules 注释的用法和用法。 How does it work for below method now?它现在如何用于以下方法? . .

public void doPeriodicCleanup() { ... }

Thanks in advance.提前致谢。

Before Java 8, a given annotation could only be set once on a method (or class, or field, etc.).在 Java 8 之前,给定的注解只能在方法(或类、字段等)上设置一次。 So, if you wanted to be able to set two different schedules on a single method, you had to define a "wrapping" annotation such as Schedules , containing an array of Schedule annotions.因此,如果您希望能够在单个方法上设置两个不同的时间表,则必须定义一个“包装”注释,例如Schedules ,其中包含一组Schedule注释。

The developer thus had to do something like this:因此,开发人员必须执行以下操作:

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

This is not very readable, and the Schedules annotation doesn't have any purpose other than containing several Schedule annotations.这不是很容易阅读,并且 Schedules 注释除了包含几个 Schedule 注释之外没有任何其他用途。

To reduce the boilerplate, but keep the annotations API identical, it's now allowed to simply annotate the method with为了减少样板,但保持注释 API 相同,现在允许简单地注释方法

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

by declaring Schedule as repeatable and specifying its "wrapping" annotation.通过将 Schedule 声明为可重复并指定其“包装”注释。 But it's just syntax sugar, that results in the same thing as the previous code: the method, at runtime, is seen as being annotated with a single Schedules annotation containing two Schedule.但这只是语法糖,结果与前面的代码相同:该方法在运行时被视为使用包含两个 Schedules 的单个 Schedules 注释进行注释。 The compiler transforms the second piece of code into the first one.编译器将第二段代码转换为第一段代码。

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

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