java中@Repeatable的理解

article/2025/9/13 23:24:57

@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();
}

编译错误信息


http://chatgpt.dhexx.cn/article/cseoOOFj.shtml

相关文章

TS:解决docker无法启动,报:start request repeated too quickly for docker.service错误-2021.12.08(已解决)

目录 文章目录 目录1、报错现象2、解决办法3、总结关于我最后 1、报错现象 首先&#xff0c;我当前的环境是&#xff1a;docker 20.10.11,vmworkstation虚机 很奇怪&#xff0c;自己的docker用着用着就出现问题了&#xff0c;查看服务发现起不来&#xff0c;重启docker服务也…

【已解决】TF_REPEATED_DATA ignoring data with redundant timestamp for frame

目录 1 问题背景2 问题探索3 问题解决4 告别Bug 1 问题背景 环境&#xff1a;Ubuntu20.04 ROS-noetic 现象&#xff1a;打开Rviz与Gazebo加载机器人模型时&#xff0c;终端不停刷新警告TF_REPEATED_DATA ignoring data with redundant timestamp for frame&#xff0c;且在未施…

已解决(一分钟)TF_REPEATED_DATA ignoring data with redundant timestamp for frame base_footprint at time解决方案

<1>问题描述 前言-仿真实验需求&#xff1a;获取小车的全局坐标系下的位姿信息&#xff0c;因此使用gmapping建图&#xff0c;并使用地图服务调用发布&#xff0c;自己写了个节点将map坐标系添加到现有的TF树上&#xff0c;最终TF树见最后截图。 进入正题&#xff0c;想…

【Protocol Buffer】Protocol Buffer入门教程(五):repeated限定修饰符

00. 目录 文章目录 00. 目录01. 限定修饰符介绍02. 字段API分析03. 测试代码04. 编译和测试05. 参考 01. 限定修饰符介绍 repeated 代表可重复&#xff0c;我们可以理解为数组 syntax "proto3";//指定版本信息&#xff0c;不指定会报错message Person //message为…

protobuf入门教程(四):repeated限定修饰符

限定修饰符说明 repeated 代表可重复&#xff0c;我们可以理解为数组&#xff1a; syntax "proto3";//指定版本信息&#xff0c;不指定会报错message Person //message为关键字&#xff0c;作用为定义一种消息类型 {string name 1; //姓名int32 id 2; …

一个真·菜鸟理解的springmvc工作原理

1 springmvc的映射器和适配器 1.1springmvc的映射器 根据客户端请求的url&#xff0c;找到处理本次请求的handler&#xff08;处理器&#xff09;&#xff0c;将url和controller关联起来 1.2springmvc的适配器 对映射器查找到的controller中的方法进行调用。 第一种&#xff1…

【转】SpringMVC的工作原理图

SpringMVC的工作原理图&#xff1a; ##SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&#xff0c;生成处理器对象及处理…

SpringMVC工作原理及执行流程

一、SpringMVC简介 SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;使用了MVC架构模式的思想&#xff0c;将web层进行职责解耦&#xff0c;并管理应用所需对象的生命周期&#xff0c;为简化日常开发&#xff0c;提供了很大便利。  …

SpringMVC工作原理图

1.用户发送请求至前端控制器DispatcherServlet(也叫中央处理器). 2.DispatcherServlet收到请求调用HandlerMappering处理器映射器 3.处理器映射器找到具体的处理器&#xff08;可以根据xml配置、注解进行查找&#xff09;&#xff0c;生成处理器对象及处理器拦截器&#xff08;…

servlet — SpringMVC工作原理

如下图&#xff0c;所有实线的部分都由 SpringMVC 框架实现&#xff0c;我们的代码只需要处理虚线的部分&#xff1a; 【总结】&#xff1a; DispatchServlet(请求分发器 / 前端控制器), 是SpringMVC的核心 1. 用户发起请求的时候调用前端控制器 DispatcherServlet&#xff1b…

SpringMVC 工作原理

0x00:请求流程图 首先,来看一下 SpringMVC 的整个请求流程,如下图: 0x01:步骤解析 SpringMVC 整体流程步骤解析: 1,用户去单击了某个请求路径,发起了一个 request 请求,这个请求会被 DispatcherServlet 前端控制器处理。 2,前端控制器 DispatcherServlet 去请求处…

SpringMVC工作原理nbsp;及注解说明

Spring MVC工作原理 及注解说明 SpringMVC框架介绍 1) spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在SpringWeb Flow里面。 Spring框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的MVC 架构&#xff0c;可以选择是使用内置的Spring Web …

SpringMVC工作原理的介绍

1.原理图&#xff1a; 2.流程文字介绍&#xff1a; 1.用户向服务器发送请求&#xff0c;请求被Spring前端控制Servlet DispatcherServlet捕获&#xff1b; 2.DispatcherServlet对请求UR进行解析&#xff0c;得到请求资源标识符&#xff08;URI&#xff09;。然后根据该URI&…

SpringMVC工作原理(1)

大家好&#xff0c;今天和大家分享SpringMVC的相关知识&#xff0c;主要是对SpringMVC的工作原理做一些分析。 SpringMVC的工作流程如下&#xff1a; 接下来我们先来对其中的组件以及相应的功能来做简单介绍&#xff1a; 组件&#xff1a; 1.DispatcherServlet DispatcherSer…

SpringMVC工作原理详解

SpringMVC工作原理详解 在学习之前&#xff0c;先来两张神图镇楼 什么是MVC 经典MVC模式中&#xff0c;M是指业务模型&#xff0c;V是指用户界面&#xff0c;C则是控制器&#xff0c;使用MVC的目的是将M和V的实现代码分离&#xff0c;从而使同一个程序可以使用不同的表现形式…

springMVC工作原理(含图)

SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一并返回给Dis…

理清SpringMVC工作原理

一、首先&#xff0c;我们先来认识一下SpringMVC的主要组件 前端控制器&#xff08;DisatcherServlet&#xff09;:接收请求&#xff0c;响应结果&#xff0c;返回可以是json,String等数据类型&#xff0c;也可以是页面&#xff08;Model&#xff09;。 处理器映射器&#xff0…

SpringMVC工作原理及源码解析

SpringMVC工作原理及源码解析 一&#xff1a;SpringMVC原理图二&#xff1a;SpringMVC的主要组件1、前端控制器DispatcherServlet&#xff1a;2、处理器映射器HandlerMapping&#xff1a;3、处理器适配器HandlerAdapter&#xff1a;4、处理器Handler&#xff1a;5、控制器Contr…

SpringMVC工作原理和工作流程

在博客看见一编写的非常清晰的博客&#xff0c;对现在的注重开发层面不注重底层原理的还是有用处的。 原文出处&#xff1a;https://www.cnblogs.com/xiaoxi/p/6164383.html SpringMVC工作原理 SpringMVC的工作原理图&#xff1a; SpringMVC流程 1、 用户发送请求至前端控制…

SpringMVC的简介概述、工作原理

SpringMVC简述概括 SpringMVC的工作原理