@Repeatable是jdk8中新增的注解,使用如Spring中的@ComponentScan注解。在没有@Repeatable注解的的注解中,在同一个地方使用相同的注解会报错,有了此元注解注解的注解,就可以在同一个地方使用相同的注解。其官方文档如下

The annotation type {@code java.lang.annotation.Repeatable} is used to indicate that the annotation type whose declaration it (meta-)annotates is repeatable. The value of @Repeatable indicates the containing annotation type for the repeatable annotation type.
@Repeatable 注解是用于声明其它类型注解的元注解,来表示这个声明的注解是可重复的。@Repeatable的值是另一个注解,其可以通过这个另一个注解的值来包含这个可重复的注解。

示例

Value注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Values.class)
public @interface Value {String value() default "value";
}

Values注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Values {Value[] value();
}

其中,@Value注解上的元注解@Repeatable中的值,使用了@Values注解,@Values注解中包含的值类型是一个@Value注解的数组!
这就解释了官方文档中@Repeatable中值的使用。

测试

注解使用方法

public class AnnotationClass {@Value("hello")@Value("world")public void test(String var1, String var2) {System.out.println(var1 + " " + var2);}
}

测试用例

// 获取使用`@Value`注解的`test`方法,并打印这个方法上的注解长度和信息@Testpublic void testValue() {Method[] methods = AnnotationClass.class.getMethods();for (Method method : methods){if (method.getName().equals("test")) {Annotation[] annotations = method.getDeclaredAnnotations();System.out.println(annotations.length);System.out.println(method.getName() + " = " + Arrays.toString(annotations));}}}

因为test方法上使用了两个@Value注解,所以猜测打印注解长度为2,然后打印详情,可是结果并不同。

1
test = [@com.example.annotations.Values(value=[@com.example.annotations.Value(value=hello), @com.example.annotations.Value(value=world)])]

结果显示,test方法上的注解长度为 1 , 且打印信息为@Values注解,它的值包含了使用的两个注解。
因此可知在jdk8中,相同注解只是以集合的方式进行了保存,原理并没有变化。

注意事项

一些约束

  • @Repeatable 所声明的注解,其元注解@Target的使用范围要比@Repeatable的值声明的注解中的@Target的范围要大或相同,否则编译器错误,显示@Repeatable值所声明的注解的元注解@Target不是@Repeatable声明的注解的@Target的子集
// Value
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Values.class)
public @interface Value {String value() default "value";
}// Values
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Values {Value[] value();
}

错误提示信息:

  • @Repeatable注解声明的注解的元注解@Retention的周期要比@Repeatable的值指向的注解的@Retention得周期要小或相同。

周期长度为 SOURCE(源码) < CLASS (字节码) < RUNTIME(运行)

// Value 注意 @Retention的值
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Values.class)
public @interface Value {String value() default "value";
}
// Values
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.CLASS)
public @interface Values {Value[] value();
}

java中@Repeatable的理解相关推荐

  1. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

  2. 【转载】谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 转载自: http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallB ...

  3. 谈谈对java中分层的理解_让我们谈谈网页设计中的卡片设计

    谈谈对java中分层的理解 "I want a card", this is the first demand point that the customer said in th ...

  4. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

  5. JAVA中多态的理解

    Java中多态的理解 JAVA中的多态可以简单的理解为一种事物的多种形态,当然多态是在继承的基础上有重写才存在. 标题如何理解一种事物的多种形态? 举个例子,拿人类.男人.女人来说.男人.女人.都分别 ...

  6. 谈谈我对Java中CallBack的理解

    CallBack是回调的意思,熟悉Windows编程的人对"回调函数"这四个字一定不会陌生,但是Java程序员对它可能就不太了解了."回调函数"或者" ...

  7. Java中Volatile的理解

    首先我们知道Java中的内存模型 即:线程工作内存--主内存 工作内存是线程私有的,主内存是线程共有的 变量的初始化,生成都在主内存,工作内存只有使用到该变量时才从主内存加载操作 共八中原子性操作,r ...

  8. java中equals的理解(1)

    在Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑的,能不能来点实际的.其实在文章里我是想表明,Java字符串两种声 ...

  9. java中resulttype,深入理解Mybatis中的resultType和resultMap

    一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部Re ...

最新文章

  1. 我对CONTAINING_RECORD宏的详细解释
  2. MemCache超详细解读
  3. 截取指定字符前_Excel应该怎么学--表格维护常用文本函数(截取、转换、连接)...
  4. Python程序开发——第一章 基本python语法
  5. 转hdmi_苹果本轻松接大屏,毕亚兹雷电接口转HDMI/VGA转换器评测
  6. 【Pytorch神经网络实战案例】19 神经网络实现估计互信息的功能
  7. css设置打印样式表,[CSS] 创建打印样式表
  8. datetime中strftime和strptime用法
  9. 学术之路如何走好?过来人的10条建议!
  10. xampp apache windows10 同一局域网下他人访问本地项目
  11. Linux安装redis最详细的教程
  12. clickHouse 使用常见问题踩坑
  13. 比较好用的自定义软键盘
  14. RDD优化--RDD共享变量(广播变量与累加器)
  15. 将AutoCAD文件中圆形替换为六边形
  16. codeforces19E Fairy
  17. 使用移动云MAS HTTP接口发送短信BASE64加密中文乱码
  18. 【练习八 结构体(强化)编程题4. 看电影】
  19. 浪漫的c语言表白代码1
  20. 概率论一:样本空间1

热门文章

  1. 自己实现一个complex class(复数类)
  2. android上传图片到PHP后台全过程
  3. Eyou内核开发木质装饰材料建材公司网站模板源码
  4. 我拼命买的学区房,现在可能要凉了
  5. java密码复杂度匹配规则
  6. Mycat分库分表分片方式
  7. 按键精灵取窗口句柄输入按键_如何通过一次按键调整所有窗口列的大小
  8. GPRS 对物流车辆管理
  9. 扫描版PDF添加目录
  10. WCF4.0新特性体验(9):非破坏性队列消息接收(Non-destructive queue receive )