Java @Repeatable
查看@PropertySource注解时候,发现了@Repeatable,从来没见过的注解,学习了下;
首先介绍下@Repeatable注解: JDK1.8出现的,作用是解决一个类上不能标注重复的注解;

当你尝试在标注重复注解时候,IDE编译器就会提示:

@Repeatable相当于指向一个容器,这样就可以在注解的地方重复标注注解了;
简单的使用例子,方便自己理解:
定义这样一个场景,每个人有不同的技能,不同职业的人又有不同的技能;
定义一个注解代表拥有的技能;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*; @Documented
@Retention(RUNTIME) //运行时注解
@Target(TYPE) //类上的注解
@Repeatable(Skills.class)
public @interface Skill { String value() default "";
}
容器注解Skills
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*; @Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface Skills { Skill[] value();
}
定义这样一个人的接口
@Skill(value="吃饭")
@Skill(value="睡觉")
public interface Human { }
定义了两个人的具体实现,展示了Skills的两种不同使用方式;
@Skill("编程")
@Skill("打游戏")
public class Programmer implements Human{
}
@Skills({@Skill("迎宾"),@Skill("上菜")})
public class Waiter implements Human {
}
测试类:
public static void main(String[] args) {
Human man = new Programmer();
// Human man=new Waiter();
Set<Class> classes=new HashSet<Class>();
classes.addAll(Arrays.asList(man.getClass().getInterfaces()));
classes.add(man.getClass());
for (Class<?> clazz : classes) {
Skill[] skills = clazz.getAnnotationsByType(Skill.class);
for (Skill skill : skills) {
System.out.println("他会:"+skill.value());
}
}
}
Java @Repeatable的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java操作wkhtmltopdf实现Html转PDF
做java开发的都知道,java生成pdf大部分都是用itext,itext的确是java开源组件的第一选择.不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java 8 指南
Benjamin Winterberg “Java is still not dead—and people are starting to figure that out.” 欢迎阅读我对 Java ...
- Java Annotation概述
@(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...
- java基础-注释
注释是一种形式的元数据,提供了非程序自身的数据,注释对于被注释的代码没有直接的影响. 本文主要概括注释的使用,java平台(SE)预定义的注释,类型注释是如跟可插入类型系统连用达到更强的类型检查的,以 ...
- Java 8简明教程
本文由 ImportNew 欢迎阅读我编写的Java 8介绍.本教程将带领你一步一步地认识这门语言的新特性.通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复 ...
- Java 8新特性终极指南
目录结构 介绍 Java语言的新特性 2.1 Lambdas表达式与Functional接口 2.2 接口的默认与静态方法 2.3 方法引用 2.4 重复注解 2.5 更好的类型推测机制 2.6 扩展 ...
- java8--类加载机制与反射(java疯狂讲义3复习笔记)
本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...
随机推荐
- HDU1025贫富平衡
做01背包做到的这个LIS,常见的n2会超时,所以才有nlogn可行 先来介绍一下n2 dp[i] 表示该序列以a[i]为结尾的最长上升子序列的长度 所以第一层循环循环数组a,第二层循环循环第i个元素 ...
- Git 安装 windows && linux
一.安装: windows下安装Git: 1.下载Git:https://git-scm.com/download/win 2.安装Git:默认安装,一直回车 Linux下安装Git: yum安装: ...
- [smarty] smarty 模板文件中进行字符串与变量的拼接
// smarty 模板引擎 $arr_tribeLabelList["`$tribe_id`_"]
- (25)uniGUI for C++ builder之UniHTMLMemo初使用及uniGUI如何调用javaScript
(25)uniGUI for C++ builder之UniHTMLMemo初使用及uniGUI如何调用javaScript 2018年09月29日 22:58:20 中国银行之路在脚下 阅读数:11 ...
- cxGrid控件过滤排序和TClientDataSet同步
https://www.cnblogs.com/false/archive/2013/02/24/2924240.html procedure TReport10Form.cxGridViewData ...
- Python 数据结构与算法—— 快排
1. 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来的数组划分成两部分:小于基准数的左子数组和大于等于基准数的右子数组.然后对这两个子数组再递归重复上述过程,直到两个子数组的所有 ...
- 在EF中使用Expression自动生成p=>new Entity(){X="",Y="",..}格式的Lambda表达式灵活实现按需更新
一.基本介绍 回忆:最早接触Expression是在学校接触到EF的时候,发现where方法里的参数是Expression<Func<T,bool>>这么一个类型,当 ...
- 【BZOJ3238】 [Ahoi2013]差异(SAM)
传送门 BZOJ 洛谷 Solution SA版本的 考虑可以建一个SAM? 那么接下来我们就考虑每一对点对之间的贡献了. 把这个式子化简一下就是无序点对之间的那啥(自己意会一下) 然后我们定义边权为 ...
- 安装openvpn
1.安装服务器端openvpn yum install -y openvpn easy-rsa 如果已存在的yum源中找不安装文件,则可通过以下安装epel yum源 rpm -ivh http:/ ...
- Swift5 语言参考(五) 语句
在Swift中,有三种语句:简单语句,编译器控制语句和控制流语句.简单语句是最常见的,由表达式或声明组成.编译器控制语句允许程序更改编译器行为的各个方面,并包括条件编译块和行控制语句. 控制流语句用于 ...