@Repeatable注解信息获取
文章目录
- @Repeatable 注解的基本语法
- demo
- 通过注解Role获取信息
- 通过注解Roles获取信息
@Repeatable 注解的基本语法
注解通常只能直接修饰某个元素一次,如果修饰了多次那么会出现编译异常
public @interface Role {String role() default "";
}
如果想要某个注解在某个元素上(直接)出现多次,那么就可以使用@Repeatable
注解
@Repeatable 有以下使用规则:
只能修饰注解。 【
@Target(ElementType.ANNOTATION_TYPE)
】@Repeatable 注解存在一个value属性,表示包含可重复注解的注解类型 【
Class<? extends Annotation> value()
】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注解信息获取相关推荐
- 如何获取注解中的值_如何在运行时利用注解信息
注解( annontation )是 Java 1.5 之后引入的一个为程序添加元数据的功能.注解本身并不是魔法,只是在代码里添加了描述代码自身的信息,至于如何理解和使用这些信息,则需要专门的解析代码 ...
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...
- 1.9 通过反射获取注解信息
使用注解修饰了类.方法.变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取处理.要想获取类.方法或变量的注解信息,必须通过 Java 的反射技术来获取 Annotation 对象, ...
- 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
文章目录 一.设置支持的注解类型 二.注解处理器中打印日志 三.主应用中使用注解 四.注解处理器 获取注解节点 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Andr ...
- Java筑基——反射(1):基本类周边信息获取
相关文章: Java筑基--反射(1):基本类周边信息获取: Java筑基--反射(2):泛型周边信息获取: Java筑基--反射(3):类内部信息获取 目录 1. 前言 2. 正文 2.1 类的生命 ...
- 字节码编程,Byte-buddy篇三《使用委托实现抽象类方法并注入自定义注解信息》
作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 截至到本章节关于字节码框架 Byte-buddy 的大部分常用 ...
- java:@Repeatable注解使用
java:@Repeatable注解使用 1 前言 java8新增了注解@Repeatable,在hibernate-validator的源码注解如@MAX.@NotNull等中,有@Repeatab ...
- java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...
JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...
- python模块os测试文件是否存在及基础原信息获取
python模块os测试文件是否存在及基础原信息获取 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路 ...
最新文章
- apache性能测试工具ab使用详解
- 集成学习VotingClassifier、HistGradientBoostingClassifier、Stacking、Blending
- linux shell 数组遍历方式(非原创)
- Java实现 简单聊天软件
- MySQL kill操作
- 分类决策树 回归决策树_决策树分类器背后的数学
- 对.NET Core未来发展趋势的浅层判断
- java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份
- 计算机win10启动慢,Win10 开机慢/Win10启动慢的常见原因
- ueditor 上传图片或者视频报错 413 Request Entity Too Large
- 使用Python编写自己的个人密码管理器
- Spark学习之路 (六)Spark Transformation和Action
- JavaScript进阶【二】JavaScript 严格模式(use strict)的使用
- Cordova 快速入门记录
- 网站运营模式之行业网站分析
- 批量转换经纬度的网页实现方法
- 机器学习 | MATLAB实现MLP多层感知机newff参数设定(下)
- Vue3+TypeScript从入门到精通系列之:Try changing the lib compiler option to es2015 or later
- 虚拟机ubuntu主机板子三者ping通
- 解决Required request body is missing:....