在某些情况下,您希望将相同的注解应用于声明或类型。从Java SE 8发行版开始,重复注解使您可以执行此操作。

例如,您正在编写代码以使用计时器服务,该服务使您能够在给定时间或某个时间表上运行方法,与UNIX `cron`服务类似。现在,您想设置一个计时器,在每月的最后一天以及每个星期五的晚上11点运行方法`doPeriodicCleanup`。要设置计时器运行,请创建`@Schedule`注解并将其应用两次到`doPeriodicCleanup`方法。第一次使用指定了月份的最后一天,第二次使用指定了星期五的下午11点,如以下代码示例所示:

```java

@Schedule(dayOfMonth="last")

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

public void doPeriodicCleanup() { ... }

```

前面的示例将注解应用于方法。您可以在任何使用标准注解的地方使用重复注解。例如,您有一个处理未授权访问异常的类。您使用一个`@Alert`注解为管理员注册类,另一个注册给管理员:

```java

@Alert(role="Manager")

@Alert(role="Administrator")

public class UnauthorizedAccessException extends SecurityException { ... }

```

出于兼容性原因,重复注解存储在由Java编译器自动生成的*容器注解*(container annotation)中。为了让编译器执行此操作,代码中需要两个声明。

**Step 1: 声明一个可重复注解类型**

-

注解类型必须用`@Repeatable`元注解标记。以下示例定义了一个自定义`@Schedule`可重复注解类型:

```java

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`注解中。

在声明中应用相同的注解而不首先声明它是可重复的,将导致编译时错误。

**Step 2: 声明包含注解类型**

-

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

```java

public @interface Schedules {

Schedule[] value();

}

```

**检索注解**

-

Reflection API中有几种可用于检索注解的方法。返回单个注解(如[`AnnotatedElement.getAnnotation(Class )`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotation-java.lang.Class-))的方法的行为不会发生变化,因为它们只会在请求类型的注解存在时返回单个注解。如果存在多个请求类型的注解,您可以通过首先获取它们的容器注解来获取它们。通过这种方式,遗留代码继续工作。在Java SE 8中引入了其他方法,这些方法扫描容器注解以一次返回多个注解,例如[`AnnotatedElement.getAnnotationsByType(Class `)](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotationsByType-java.lang.Class-)。有关所有可用方法的信息,请参阅[`AnnotatedElement`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html)类规范。

**设计注意事项**

-

设计注解类型时,必须考虑该类型注解的基数。现在可以使用同一个注解一次或零次,或者,如果注解的类型被标记为`@Repeatable`,则可以多次使用。也可以通过使用`@Target`元注解来限制注解类型的使用位置。例如,您可以创建只能在方法和字段上使用的可重复注解类型。仔细设计注解类型非常重要,以确保使用注解的程序员发现它尽可能灵活和强大。

java 8 重复注解报错,重复注解 · Java 8 Document Translation · 看云相关推荐

  1. java 注解报错_java注解验证接收参数 返回注解字段的错误

    1.在controller接口方法接收参数加上 @Valid注解 并且在实体类参数后紧跟 BindingResult bindingresul BindingResultMsgUtil工具类: pub ...

  2. java通讯链路异常报错_【Java】有了链路日志增强,排查Bug小意思啦!

    在工作中,相信大家最怕的一件事就是听到有人在工作群艾特你:某某功能报错啦... 然后你就得屁颠屁颠的去服务器看日志,日志量少还好点,多的话找起来太麻烦了.不太容易直接定位到关键地方. 东找找西找找,好 ...

  3. param注解报错_mybatis不加@Parm注解报错的解决方案

    我的idea版本2017.3.4,低版本貌似不会加上这个配置,idea高版本会 补充知识:Mybatis传多个参数的问题 及MyBatis报错 Parameter '0' not found. Ava ...

  4. 在idea中使用@Test注解报错的解决方案

    在idea中使用@Test注解报错的解决方案 参考文章: (1)在idea中使用@Test注解报错的解决方案 (2)https://www.cnblogs.com/charlypage/p/90479 ...

  5. Spring Boot项目@RunWith注解报错

    Spring Boot项目中,新添加test类,使用@RunWith注解报错,肯定是项目中没有添加依赖. 解决办法: 1.pom.xml引入依赖 <!--添加junit环境的jar包--> ...

  6. vue重复路由报错解决

    vue重复路由报错解决 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation- 分为三种解决方式 1.捕获异 ...

  7. mysql update主键冲突_mysql主键重复,不报错,只更新的操作

    项目中对接一个单点登陆的回调api,需要判断用户是否在库,不在库新增用户,在库更新登陆次数,大概代码如下:<?php $isExist = true; if ($isExist) { inser ...

  8. 用IDEA新建一个springboard项目配置热部署解决AutoWired注解报错

    1.新建Spring Boot项目 * 注意:项目名必须全部小写* 勾选一些需要的组建 我这里勾选了DevTools模块可以包含在任何项目中,它可以节省大量的时间. 和web模块还有链接数据库用的jd ...

  9. IDEA中@override注解报错信息“Method does not override method from its superclass“

    IDEA中@override注解报错信息"Method does not override method from its superclass" 出现问题原因: 1. 首先查看这 ...

最新文章

  1. 今日看点:“靠脸进站”的刷脸系统究竟是如何实现的
  2. 【深度学习】一个应用—肝脏CT图像自动分割(术前评估)
  3. php mysql数据库 指南_用 PHP 创建 MySQL 数据库
  4. div中iframe高度自适应问题
  5. 征稿 | 计算机视觉与数据挖掘-EI会议 ICCVDM2020
  6. react native项目增加devtools工具
  7. 提高Office2010等高版的启动速度文章链接收集-Office2010打开慢速度怎么办?
  8. 【C语言】双人格斗小游戏(源码)
  9. sm4 的s盒_国密SM4算法
  10. diabetes影响因子2017_【重磅】2017 年内分泌领域 SCI 期刊影响因子出炉
  11. win10家庭版,双击bat文件无法运行_20200120
  12. AttributeError: module 'ahocorasick' has no attribute 'Automaton'解决
  13. 基于HI600R的差分GPS设搭建过程介绍
  14. 证件照如何弄蓝白渐变色背景
  15. python 绘制RGB三维颜色空间色谱图(已实现)
  16. 酷酷资源社网站同款xiuno模板/知乎蓝魔改版源码/附多个插件
  17. Java 基于WEB的农产品销售管理系统源码+数据库+论文文档+项目辅导视频
  18. java activiti_《Activiti实战》PDF 下载
  19. CPU拓扑结构中的Die等级是指什么?
  20. smartSVN 分支合并到主干上,iOS 编译时链接错误

热门文章

  1. 物联网需要什么样的应用开发语言?
  2. 在线画图网站Graph Editor的使用
  3. 安装包没意思?带你手动下载OpenWrt源码编译安装!
  4. iOS - 直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit
  5. Android Automotive(五) CarService
  6. 联想Thinkbook15P+Ubuntu18.04安装nvidia显卡驱动
  7. php随机生成密码函数
  8. avue 富文本avue-form ,avue-crud 及独立使用的详细介绍
  9. 【问题】网络电缆被拔出
  10. 【十二省联考2019】春节十二响