24.Java 新特性扩展(重复注解、类型注解)

一、重复注解

1、基本介绍
  • 自从 JDK 5 引入注解以来,注解的使用开始流行,在各个框架中被广泛使用

  • 不过注解有一个很大的限制,在同一个地方不能多次使用同一个注解

  • JDK 8 引入了重复注解的概念

2、具体实现
(1)自定义注解
  • MyAnnotation 注解
package com.my.repeatannotation;import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;// 指定对应的容器
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String value();
}
  • MyAnnotations 注解(重复注解的容器)
package com.my.repeatannotation;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {MyAnnotation[] value();
}
(2)实体类
  • MyUser 类
package com.my.repeatannotation;@MyAnnotation("a1")
@MyAnnotation("a2")
@MyAnnotation("a3")
public class MyUser {@MyAnnotation("b1")@MyAnnotation("b2")@MyAnnotation("b3")private String name;@MyAnnotation("c1")@MyAnnotation("c2")@MyAnnotation("c3")public void say() {};
}
(3)测试
  • RepeatAnnotationTest 类
package com.my.repeatannotation;import java.lang.reflect.Field;
import java.lang.reflect.Method;public class RepeatAnnotationTest {public static void main(String[] args) {Class<MyUser> myUserClass = MyUser.class;// 获取类的重复注解MyAnnotation[] myAnnotations1 = myUserClass.getAnnotationsByType(MyAnnotation.class);for (MyAnnotation myAnnotation : myAnnotations1) {System.out.println(myAnnotation.value());}// 获取属性的重复注解Field[] declaredFields = myUserClass.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);MyAnnotation[] myAnnotations2 = declaredField.getAnnotationsByType(MyAnnotation.class);for (MyAnnotation myAnnotation : myAnnotations2) {System.out.println(myAnnotation.value());}}// 获取方法的重复注解Method[] declaredMethods = myUserClass.getDeclaredMethods();for (Field declaredField : declaredFields) {MyAnnotation[] myAnnotations3 = declaredField.getAnnotationsByType(MyAnnotation.class);for (MyAnnotation myAnnotation : myAnnotations3) {System.out.println(myAnnotation.value());}}}
}

二、类型注解

1、基本介绍
  • JDK 8 中为 @Target 添加了两种类型

    • ElementType.TYPE_PARAMETER:表示该注解可以写在参数列表的数据类型或泛型的声明语句中

    • ElementType.TYPE_USE:表示该注解可以写在任何数据类型的声明语句中

2、具体实现
(1)自定义注解
  • MyType 注解
package com.my.typeannotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyType {String value();
}
(2)实体类
  • MyStudent 类
package com.my.typeannotation;import java.time.Instant;public class MyStudent {private @MyType("hello1") String name;private @MyType("Hello2") Instant age;public @MyType("Hello3") String say() {return "Hello World";};public String eat(@MyType("Hello4") String food) {return "Hello World";}
}
(3)测试
  • TypeAnnotationTest 类
package com.my.typeannotation;import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;public class TypeAnnotationTest {public static void main(String[] args) {Class<MyStudent> myStudentClass = MyStudent.class;TypeVariable<Class<MyStudent>>[] typeParameters = myStudentClass.getTypeParameters();for (TypeVariable<Class<MyStudent>> typeParameter : typeParameters) {// 获取类中泛型中的注解MyType myType = typeParameter.getAnnotation(MyType.class);System.out.println(myType.value());}Field[] declaredFields = myStudentClass.getDeclaredFields();for (Field declaredField : declaredFields) {// 获取属性的数据类型的注解AnnotatedType annotatedType = declaredField.getAnnotatedType();MyType myType = annotatedType.getAnnotation(MyType.class);System.out.println(myType.value());}Method[] declaredMethods = myStudentClass.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {if (declaredMethod.getName().equals("say")) {// 获取方法返回值的注解AnnotatedType annotatedReturnType = declaredMethod.getAnnotatedReturnType();MyType myType = annotatedReturnType.getAnnotation(MyType.class);System.out.println(myType.value());} else if (declaredMethod.getName().equals("eat")) {// 获取方法参数列表的注解AnnotatedType[] annotatedParameterTypes = declaredMethod.getAnnotatedParameterTypes();MyType myType = annotatedParameterTypes[0].getAnnotation(MyType.class);System.out.println(myType.value());}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端java开发路由接口并部署服务器(四)

一、安装IntelliJ IDEA&#xff0c;安装包下载 1、官网下载 2、网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 打开IntelliJ IDEA&#xff0c;输入网盘资源文件内容 三、汉化处理 插件搜索chinese&#xff0c;就会找到相应的插件安装重启软件即可 四、新建后端j…

Vue.js 表单验证实战:一个简单的登录页面

修改日期备注2025.1.2初版 一、前言 Vue.js 学习第一天——学会一个带有简单表单验证的登录页面。通过这个项目&#xff0c;会对 Vue.js 的核心概念有了更深入的理解&#xff0c;加深掌握如何运用 Vue 的一些强大特性来实现动态交互和数据处理。 二、项目的基本结构 首先&a…

MySQL 锁那些事

Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?Q2 : 行锁是如何实现的?什么情况下会使用行锁?Q3 : 四种事务隔离形式的行锁有什么不一样?读未提交读提交可重复读串行 Q4 : MySQL 的读写都是怎样加锁的?Q5 : 需要注意什么? Q1 : MySQL有哪些锁,功能是什么,如何项目中使用…

国产文本编辑器EverEdit - 批量转码转换行符

1 批量转码&转换行符 1.1 应用场景 如果用户批量在Windows编辑文件&#xff0c;要上传到异构系统&#xff0c;如&#xff1a;Linux&#xff0c;则需要批量转换编码和换行符&#xff0c;此时可以使用EverEdit的批量转码功能。 1.2 使用方法 选择主菜单文档 -> 批量转码…

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

成立一家无人机培训机构需要哪些基础配置

成立一家无人机培训机构&#xff0c;需要一系列基础配置来确保教学质量、学员安全以及机构的正常运营。以下是根据公开发布的信息整理出的关键基础配置&#xff1a; 一、场地配置 1. 飞行场&#xff1a;提供一个安全、宽敞的室外飞行环境&#xff0c;面积最好大于三千平米&…

交换机性能详解

1. 背板带宽 只有模块化交换机&#xff08;拥有可扩展插槽&#xff0c;可灵活改变端口数量&#xff09;才有这个概念&#xff0c;固定端换机是没有这个概念的。并且固定端换机的背板容量和交换容量大小是相等的。 背板带宽是交换机的总数据处理能力&#xff0c;由硬件架构设…

读“将计算性能调高到极致的基点秘诀”的尝试

看到一篇文章&#xff0c;说最近阅读LAMMPS源码&#xff0c;悟出了很多道理。在计算性能优化这块&#xff0c;源代码作者很多写法我最初不以为意&#xff0c;后来发现是作者有意为之&#xff0c;就是为了把计算性能优化到极致。做计算仿真软件&#xff0c;也特别需要注意这些吧…

Gitea代码仓服务搭建

特点与优势 轻量级:Gitea是一个轻量级的Git服务,提供了快速、稳定的代码托管和协作开发环境。它资源占用低,适合在资源受限的环境中运行。易于安装和部署:Gitea提供了简单易用的安装和部署方式,支持多种安装方式,包括二进制文件、Docker容器等,并提供了详细的文档和配置…

leetcode hot 小偷

class Solution(object):def rob(self, nums):""":type nums: List[int]:rtype: int"""# 使用动态规划&#xff0c;把之前的给保存起来ans[0,nums[-1]]for i in range(1,len(nums)):ans.append(max(ans[-1],ans[-2]nums[-1*i-1]))return ans[-1]…

端口被占用

端口8080被占用 哈哈哈&#xff0c;我是因为后端项目跑错了&#xff0c;两个项目后端名称太像了&#xff1b; &#xff08;1&#xff09;netstat -aon | findstr 8080&#xff0c;找到占用8080端口的进程号&#xff0c;获取对应的进程号pid&#xff1b; &#xff08;2&#…

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…

[人工智能] 结合最新技术:Transformer、CLIP与边缘计算在提高人脸识别准确率中的应用

随着人工智能的快速发展&#xff0c;特别是深度学习和自然语言处理领域的革命性技术&#xff0c;越来越多的前沿技术被应用于人脸识别中。Transformer架构、CLIP模型以及边缘计算的结合&#xff0c;正成为提升人脸识别准确率和应用效能的关键技术路径。特别是在多样化场景下&am…

Python的*args和**kwargs

参考 总结&#xff1a; &#xff08;1&#xff09;*args用于在函数中处理传递的位置参数序列&#xff1b; &#xff08;2&#xff09;**kwargs则用于处理传递的关键字参数字典。 &#xff08;3&#xff09;示例&#xff1a; def complex_function(first, *args, **kwargs)…

Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)

最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法&#xff0c;可以参考一下https://element-plus.org/zh-CN/component/table.html 但项目中&#xff0c;后台数据返回格式和指定合并是动态且没有规律的&#xff0c;Element 的示例过于简单&…

免费又开源:企业级物联网平台的新选择 ThingsPanel

在开源领域&#xff0c;选择合适的开源协议是开发者和企业能否充分利用平台的关键。ThingsPanel&#xff0c;作为一个专注于物联网的开源平台&#xff0c;近日将协议从 AGPLv3 改为更开放的 Apache 2.0。这一改变对开发者和用户意味着什么&#xff1f; 为什么协议要从 AGPLv3 转…

C# 设计模式(结构型模式):代理模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;代理模式 在软件开发中&#xff0c;有时我们需要通过某种方式间接地访问一个对象&#xff0c;这时就可以使用代理模式&#xff08;Proxy Pattern&#xff09;。代理模式通过引入一个代理对象来控制对目标对象的访问…

关于AI面试系统2025年趋势评估!

在快速发展的科技浪潮中&#xff0c;AI技术正以前所未有的速度渗透到各行各业。企业招聘领域&#xff0c;作为人才选拔的关键环节&#xff0c;也不例外地迎来了AI面试系统的广泛应用和持续创新。2025年&#xff0c;AI面试系统不仅成为企业招聘的主流工具&#xff0c;更在智能化…

MySQL 01 02 章——数据库概述与MySQL安装篇

一、数据库概述 &#xff08;1&#xff09;为什么要使用数据库 数据库可以实现持久化&#xff0c;什么是持久化&#xff1a;数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用是&#xff1a;将内存中的数据存储在关系型数据库中&#xff0c;当然也可以…

Linux 挥别 WinXP 时代协议,USB RNDIS 即将退场

IT之家 1 月 2 日消息&#xff0c;Linux 基金会研究员 Greg Kroah-Hartman 计划在 Linux 内核中&#xff0c;彻底移除 USB RNDIS 协议驱动。 IT之家查询公开资料&#xff0c;USB RNDIS 是一种远程网络驱动接口规范&#xff0c;将 USB 设备模拟成网卡&#xff0c;从而在计算机和…