文章目录

  • @Repeatable 注解的基本语法
  • demo
    • 通过注解Role获取信息
    • 通过注解Roles获取信息

@Repeatable 注解的基本语法

注解通常只能直接修饰某个元素一次,如果修饰了多次那么会出现编译异常

public @interface Role {String role() default "";
}

如果想要某个注解在某个元素上(直接)出现多次,那么就可以使用@Repeatable 注解

@Repeatable 有以下使用规则:

  1. 只能修饰注解。 【@Target(ElementType.ANNOTATION_TYPE)

  2. @Repeatable 注解存在一个value属性,表示包含可重复注解的注解类型 【Class<? extends Annotation> value()

  3. value 属性值表示的注解 必须存在value成员必须是数组,这个value成员指定重复出现的注解类型

注意: 关于第3条这属于一种约定,具体原因,详情请看 ,getDeclaredAnnotationsByType 分析

demo

按照上面的规则,创建如下两个注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Roles {//value属性必须存在,指定Role 属性可以重复存在Role[] value();
}
@Repeatable(Roles.class)
public @interface Role {String role() default "";
}
@Role(role = "role1")
@Role(role = "role2")
@Role(role = "role3")
public class Person {// 省略一些方法属性
}
通过注解Role获取信息

这其实是间接存在的注解,可以通过下面的方法获取注解信息

 @Testpublic void indriectAnnotation(){//间接存在Arrays.asList(Person.class.getDeclaredAnnotationsByType(Role.class)).forEach(action-> {if (action instanceof Role) {System.out.println("getDeclaredAnnotationsByType\t"+ action.role());}});//关联Arrays.asList(Person.class.getAnnotationsByType(Role.class)).forEach(action-> {if (action instanceof Role) {System.out.println("getAnnotationsByType\t"+ action.role());}});}

getDeclaredAnnotationsByType role1
getDeclaredAnnotationsByType role2
getDeclaredAnnotationsByType role3
getAnnotationsByType role1
getAnnotationsByType role2
getAnnotationsByType role3

当然除了上面的定义方式,还可以选择下面的方式:

@Roles({@Role(role="role1"),@Role(role="role2")})
public class Person{}
通过注解Roles获取信息

这中属于直接存在,可以通过下面的方法获取注解信息

 @Testpublic void directAnnotationRoles(){Roles roleAnnotation = Person.class.getDeclaredAnnotation(Roles.class);System.out.println("getDeclaredAnnotations   ");Arrays.stream(roleAnnotation.value()).forEach(role -> System.out.println(role.value()));//存在(直接存在,继承直接存在)Arrays.asList(Person.class.getAnnotations()).forEach(action -> {if (action instanceof Roles) {System.out.println("getAnnotations   " );Arrays.stream(roleAnnotation.value()).forEach(role -> System.out.println(role.value()));}});// 直接存在 或间接存在Arrays.asList(Person.class.getDeclaredAnnotationsByType(Roles.class)).forEach(action -> {System.out.println("getDeclaredAnnotationsByType");Arrays.stream(action.value()).forEach(role -> System.out.println(role.value()));});//关联Arrays.asList(Person.class.getAnnotationsByType(Roles.class)).forEach(action -> {if (action instanceof Roles) {System.out.println("getAnnotationsByType");Arrays.stream(roleAnnotation.value()).forEach(role -> System.out.println(role.value()));}});}

getDeclaredAnnotations
role1
role2
getAnnotations
role1
role2
getDeclaredAnnotationsByType
role1
role2
getAnnotationsByType
role1
role2

@Repeatable注解信息获取相关推荐

  1. 如何获取注解中的值_如何在运行时利用注解信息

    注解( annontation )是 Java 1.5 之后引入的一个为程序添加元数据的功能.注解本身并不是魔法,只是在代码里添加了描述代码自身的信息,至于如何理解和使用这些信息,则需要专门的解析代码 ...

  2. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )

    文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  3. 1.9 通过反射获取注解信息

    使用注解修饰了类.方法.变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取处理.要想获取类.方法或变量的注解信息,必须通过 Java 的反射技术来获取 Annotation 对象, ...

  4. 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )

    文章目录 一.设置支持的注解类型 二.注解处理器中打印日志 三.主应用中使用注解 四.注解处理器 获取注解节点 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Andr ...

  5. Java筑基——反射(1):基本类周边信息获取

    相关文章: Java筑基--反射(1):基本类周边信息获取: Java筑基--反射(2):泛型周边信息获取: Java筑基--反射(3):类内部信息获取 目录 1. 前言 2. 正文 2.1 类的生命 ...

  6. 字节码编程,Byte-buddy篇三《使用委托实现抽象类方法并注入自定义注解信息》

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 截至到本章节关于字节码框架 Byte-buddy 的大部分常用 ...

  7. java:@Repeatable注解使用

    java:@Repeatable注解使用 1 前言 java8新增了注解@Repeatable,在hibernate-validator的源码注解如@MAX.@NotNull等中,有@Repeatab ...

  8. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...

    JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...

  9. python模块os测试文件是否存在及基础原信息获取

    python模块os测试文件是否存在及基础原信息获取 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路 ...

最新文章

  1. apache性能测试工具ab使用详解
  2. 集成学习VotingClassifier、HistGradientBoostingClassifier、Stacking、Blending
  3. linux shell 数组遍历方式(非原创)
  4. Java实现 简单聊天软件
  5. MySQL kill操作
  6. 分类决策树 回归决策树_决策树分类器背后的数学
  7. 对.NET Core未来发展趋势的浅层判断
  8. java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份
  9. 计算机win10启动慢,Win10 开机慢/Win10启动慢的常见原因
  10. ueditor 上传图片或者视频报错 413 Request Entity Too Large
  11. 使用Python编写自己的个人密码管理器
  12. Spark学习之路 (六)Spark Transformation和Action
  13. JavaScript进阶【二】JavaScript 严格模式(use strict)的使用
  14. Cordova 快速入门记录
  15. 网站运营模式之行业网站分析
  16. 批量转换经纬度的网页实现方法
  17. 机器学习 | MATLAB实现MLP多层感知机newff参数设定(下)
  18. Vue3+TypeScript从入门到精通系列之:Try changing the lib compiler option to es2015 or later
  19. 虚拟机ubuntu主机板子三者ping通
  20. 解决Required request body is missing:....

热门文章

  1. 元启发式 启发式_30个美丽的三色网站给您的启发
  2. 基于Qt Designer和PyQt5的桌面软件开发--环境搭建和入门例子
  3. Linux的SOCKET编程详解——非常叼
  4. 前端验证代码 - JS
  5. OpenGL核心技术之切线空间
  6. 群晖搭建个人网站,内网穿透实现公网访问 3/3
  7. GPS的信号强度以及matlab信号模拟
  8. tinyxml2简单的创建、增、删、改、查
  9. js实现分数计算器的代码
  10. 51单片机串口通信发送以及接收代码详解2