Repeatable:JDK8引入的元注解,表示被修饰的注解可以重复应用标记。这个注解比较绕,看了很久才想明白… 使用Repeatable元注解,需要定义一个目标注解,另外还需要定义一个存放目标注解的容器。

实例:

生活中的我们每个人都有很多不同的爱好,我们可以把每一种爱好都当做一种注解。因此可以利用Repeatable注解定义我们的爱好注解(每个人的爱好都不止一个),然后使用这个爱好注解修饰一个人。

首先定义一个注解容器,这个容器用于存放我们所有的兴趣爱好。

@Target(value = ElementType.TYPE)          //作用对象是类、接口、枚举
@Retention(RetentionPolicy.RUNTIME)            //JVM运行能够反射加载
public @interface Container {Element[] value();                        //注解(兴趣爱好)
}

再定义注解(兴趣爱好标签),注解需要存放在容器中。

@Repeatable(Container.class)                //这个注解存放在容器中
public @interface Element {String hobby() default "";                //注解参数
}

然后定义一个实体类Person,给Person加上注解容器,容器中存放一个个的注解。

@Container(value = {@Element(hobby = "吃饭"),                @Element(hobby = "睡觉"),@Element(hobby = "编程"),@Element(hobby = "游戏"),@Element(hobby = "看书")}
)
public class Person {private String name = "";
}

测试如下

public class Main {public static void main(String[] args) {String name = "annotation.repeatable.Person";try{Annotation[] annotations = Class.forName(name).getAnnotations();     //获取注解int count = annotations.length;for(int i = 0;i < count;i++){System.out.println(annotations[i].annotationType());   //获取注解类型if(Person.class.isAnnotationPresent(Container.class)){  //注解类型判断//得到注解容器Container container = Person.class.getAnnotation(Container.class); //得到注解容器中的每一个元素值for(Element element :  container.value()){System.out.println(element.hobby());}}}} catch (Exception e){System.out.println(e.getCause());}}
}

分析


Container容器修饰Person类,而修饰的内容是一个个的注解,存放在Container容器中。然后通过反射获取到Container容器注解,最后通过容器注解获取到容器中的一个个注解。(有点绕)现在这个Container容器有没有感觉有点像Target元注解?里面的一个个Element像极了Target元注解中表示作用类型的名称?

@Container(value = {@Element(hobby = "吃饭"),                @Element(hobby = "睡觉"),@Element(hobby = "编程"),@Element(hobby = "游戏"),@Element(hobby = "看书")}
)@Target(value = {ElementType.FIELD,ElementType.METHOD})

但是这样并没有体现出重复应用标记或者说表现的不明显于是出现了简化,直接将容器注解略去,用一个个的注解直接修饰类。

@Element(hobby = "吃饭")
@Element(hobby = "睡觉")
@Element(hobby = "编程")
@Element(hobby = "游戏")
@Element(hobby = "看书")

这种写法也会自动转化为存到容器中。这种写法语法要简单一点,但是有点晦涩难懂。

Repeatable元注解相关推荐

  1. JAVA注解 | 可重复元注解@Repeatable

    目录 使用 @Repeatable 使用反射获取注解 约束 @Repeatable 是 JDK1.8 增加的元注解,用于声明当前注解是可重复的.如果有没有声明 @Repeatable,在同一个地方使用 ...

  2. java 元注解 @Repeatable

    目录 一 笔记 二 自定义注解容器Persons 三 自定义的注解AnnotationTest08_Person ,即可重复使用的注解 四 通过反射机制获取重复注解的信息 一 笔记 元注解 @Repe ...

  3. JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)。

    jdk1.5起开始提供了4个元注解,用来定义自定义注解的注解,它们分别是: @Target 指定注解使用的目标范围(类.方法.字段等),其参考值见类的定义:java.lang.annotation.E ...

  4. 1.7 元注解作用及使用

    元注解是负责对其它注解进行说明的注解,自定义注解时可以使用元注解.Java 5 定义了 4 个注解,分别是 @Documented.@Target.@Retention 和 @Inherited.Ja ...

  5. c JAVA 注解,Java元注解作用及使用

    元注解是负责对其它注解进行说明的注解,自定义注解时可以使用元注解.Java 5 定义了 4 个注解,分别是 @Documented.@Target.@Retention 和 @Inherited.Ja ...

  6. JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)

    转载自 JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited) jdk1.5起开始提供了4个元注解,用来定义自定义注解的注解,它们 ...

  7. Java元注解作用及使用

    元注解是负责对其它注解进行说明的注解,自定义注解时可以使用元注解.Java 5 定义了 4 个注解,分别是 @Documented.@Target.@Retention 和 @Inherited.Ja ...

  8. java元注解_Java的元注解

    注解是一系列元数据,它利用元数据来解释.说明程序代码(即被注解的对象).注解的作用包括: 1.提供信息给编译器,编译器可以利用注解来探测错误和警告信息. 2.软件工具可以利用注解信息来生成代码.HTM ...

  9. 玩转Java注解:元注解、内置注解、自定义注解的原理和实现

    点击关注公众号,实用技术文章及时了解 来源:www.jianshu.com/p/ddd0b880641a 前言 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种 ...

最新文章

  1. azure mysql 配置,微软Azure云MySQL in-app 的配置,简化PHP内容管理系统配置
  2. css提取页面元素唯一性_一日一技:爬虫如何正确从网页中提取伪元素?
  3. webpack4.x最详细入门讲解
  4. Vue — 第四天(components组件)
  5. 宣布在日本地区正式发布 Windows Azure
  6. android monkey压力测试,Android-Monkey 压力测试
  7. java线程立刻执行_Java 线程调用start()后会立即执行run()方法吗?
  8. 65 SD配置-交货凭证配置-定义相关项目类别的拣配相关
  9. 疫情期间天天对你“开枪”的额温枪,你知道它的工作原理吗?| 原力计划
  10. python及拓展版_python扩展模块
  11. 16级大一c语言考试题及答案,2013年计算机二级C语言上机试题十六及答案
  12. 游戏筑基开发之学生管理系统数据结构及数据结构解析图(C语言)
  13. 跨服务器、跨数据库、多表联合查询
  14. 拓端tecdat|R语言如何找到患者数据中具有差异的指标?(PLS—DA分析)
  15. vPro这个v字代表什么意思
  16. 抓包实现原理与反抓包
  17. Q-criterion- definition and post-processing
  18. 关于“TCP segment of a reassembled PDU”
  19. Git远程分支管理(四)
  20. 爬取前程无忧数据,并存入数据库

热门文章

  1. 驰骋工作流-流程发起-自动发起-定时启动-专题讲解
  2. 那些年我们追过的网络库
  3. 为什么电脑连不上手机热点,电脑怎么连接手机WIFI热点
  4. Android OpenCV(五十一):图像插值
  5. Ninth season eighteenth episode,they bought lotteries,can they win??????
  6. Vue.js 指令v-for和v-if和v-show
  7. 「春招系列」30张图理解HTTP在面试中所有会出现的题
  8. 《小猫猫大课堂》三轮5——动态内存管理(通讯录动态内存化)
  9. 转载——陀螺仪工作原理
  10. 如何完美适配iPhone4、5、6尺寸和字体问题