Java教程是为JDK 8编写的。本页中描述 的示例 和实践没有利用后面版本中引入的改进。
重复注释
在某些情况下,您希望对声明或类型使用应用相同的注释。在JavaSE 8发行版时, 重复注释 让你做这件事。
例如,您正在编写代码来使用计时器服务,该服务使您能够在给定的时间或特定的时间表上运行一个方法,类似于 UNIX 克隆服务。现在您想要设置一个计时器来运行一个方法,多周期清理,在这个月的最后一天,每个星期五晚上11:00。若要将计时器设置为运行,请创建@Schedule注释,并将其两次应用于多周期清理方法。第一种用法指定月份的最后一天,第二种指定星期五晚上11点,如下面的代码示例所示:
@Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Fri", hour="23") public void doPeriodicCleanup() { ... }
前面的示例将注释应用于方法。您可以在任何要使用标准注释的地方重复注释。例如,您有一个类用于处理未经授权的访问异常。你用一个注释这个类@ Alert 管理人员注释和管理员注释:
@Alert(role="Manager")
@Alert(role="Administrator")
public Class UnauthorizedAccessException extends SecurityException { ... }
出于兼容性原因,重复注释存储在 容器注释 它是由Java编译器自动生成的。为了让编译器做到这一点,您的代码中需要两个声明。
步骤1:声明可重复的注释类型
批注类型必须用@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;
}
的值。@Repeatable元注释,括号中,是Java编译器为存储重复注释而生成的容器注释的类型。在本例中,包含注释类型为Schedules,如此重复@Schedule注释存储在@Schedules注释
将相同的注释应用于声明,而不首先声明它是可重复的,则会导致编译时错误。
步骤2:声明包含注释类型
包含注释类型必须具有value具有数组类型的。数组类型的组件类型必须是可重复的注释类型。声明Schedules包含注释类型的内容如下:
public @interface Schedules { Schedule[] value(); }
检索注释
反射API中有几种方法可用于检索注释。返回单个注释的方法的行为,如注释元素(类),不变,因为它们只返回一个注释,如果 一 存在请求类型的注释。如果存在多个请求类型的注释,则可以通过首先获得它们的容器注释来获得它们。通过这种方式,遗留代码继续工作。JavaSE 8中引入了其他方法,它们通过容器注释扫描以同时返回多个注释,例如AnnotatedElement.getAnnotationsByType(Class)。见附加元素有关所有可用方法的信息的类规范。
设计考虑
在设计注释类型时,必须考虑 基数 那种类型的注解。现在可以使用注释零次,一次,或者,如果注释的类型被标记为@Repeatable不止一次。还可以通过使用@Target元注释例如,您可以创建只能用于方法和字段的可重复注释类型。重要的是仔细设计注释类型,以确保程序员 使用 注释发现它尽可能灵活和强大。