递归出java实体类中所有带@Schema注解且有复杂类型属性List<T>泛型类型

一、问题描述:

Excel表格导出实体类中所需要的字段,在不借助数据库字典表存储字段的情况下,且实体类属性中除去基本类型外还有List<T>复杂类型,如何实现?

二:问题分析:

核心问题1:解析出所有@Schema注解对应的字段属性
核心问题2:当有List<T>泛型类时,如何获取其泛型属性,如果List<T>泛型类中又存在List<T>,又当如何操作?如:User类中有List<Role>,Role类中有List<Permission>,且都有相同属性字段,id,name;

三:解决核心问题:

核心问题1:
通过类获取对应的Class加载类,如:User.Class,user.getClass();
通过Class加载类反射获取所有字段,如:Field[] fields = class.getDeclaredFields();
通过Field获取其名称为Schema的注解字段,如:Schema schema = fields[i].getAnnotation(Schema.class);

核心问题2:
通过Field获取属性类型并判断其类型为List类型,再做后续处理,如:List.class.isAssignableFrom(fields[i].getType());
通过Field获取参数类型,并判断是否属于ParameterizedType类型,并做强转;
通过强转类型获取最终List泛型对应的具体类型,如:Class<?> ct = (Class<?>) type.getActualTypeArguments()[0];

四:核心代码如下:

void getAnnotationFields(Class c, Map<String> map) {Field[] fields = c.getDeclaredFields();for (int i = 0; i < fields.length; i++) {//获取实体类,属性中添加@Schema注解的字段Schema schema = fields[i].getAnnotation(Schema.class);//判单如果字段属性是List<T>泛型集合,获取泛型类具体的Class类,以便递归出实体类中所有为List<T>泛型类下面的字段if (List.class.isAssignableFrom(fields[i].getType())) {if (fields[i].getGenericType() instanceof ParameterizedType) {ParameterizedType type = (ParameterizedType) fields[i].getGenericType();Class<?> ct = (Class<?>) type.getActualTypeArguments()[0];getAnnotationFields(ct, map);}} else {map.put(schema.description(),fields[i].getName());}}}

最终返回map集合,是所有获取的属性值,这里注意的是,map会覆盖掉不同实体类中属性字段相同的属性,且hashMap不能正常排序。

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

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

相关文章

Pandas读取文本文件为多列

要使用Pandas将文本文件读取为多列数据&#xff0c;你可以使用pandas.read_csv()函数&#xff0c;并通过指定适当的分隔符来确保正确解析文件中的数据并将其分隔到多个列中。 假设你有一个以逗号分隔的文本文件&#xff08;CSV格式&#xff09;&#xff0c;每一行包含多个值&a…

SpringBoot注解--06--JSRValidatorUtil

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Validation数据校验Spring ValidationSpring 提供的数据校验方式&#xff1a;依赖引入&#xff1a;Spring Validation常用的注解 手动校验&#xff1a;通过 …

表 ,索引的 degree 检查, trim(degree) default INSTANCES

检查degree >1 的 select substr(owner,1,15) Owner , ltrim(degree) Degree, ltrim(instances) Instances, count(*) "Num Tables" , Parallel from dba_tables where ( trim(degree) > 1 ) and table_name not like ET$% group by owner, degree , ins…

电商平台接口|获取价格数据,做好竞品分析

京东获得JD商品详情 API返回值说明 item_get-获得JD商品详情 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[it…

Springboot 在线学习交流平台-计算机毕业设计源码46186

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线学习交流平台当然也不能排除在外。在线学习交流平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

飞睿uwb定位tag防丢器,蓝牙智能防丢器原理,支持苹果IOS的本地防丢查找

在当今这个快节奏的社会&#xff0c;人们的注意力经常被各种琐事分散&#xff0c;丢三落四的情况时有发生。随着科技的发展&#xff0c;智能防丢器应运而生&#xff0c;成为帮助我们解决这一烦恼的助手。今天&#xff0c;我们就来深入探讨一款备受瞩目的智能防丢产品——飞睿UW…

CDH6.3.2安装文档

前置环境&#xff1a; 操作系统&#xff1a; CentOS Linux release 7.7 java JDK &#xff1a; 1.8.0_231 1、准备工作 准备以下安装包&#xff1a; Cloudera Manager: cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm cloudera-manager-daemons-6.3.1-1466458.el…

视频号小店是什么?没有货源可以去做吗?一篇详解!

大家好&#xff0c;我是电商小V 视频号小店近两年在创业者眼中可以说是一个可以去操作的项目&#xff0c;也是可以激起来很高的讨论度&#xff0c;但是很多小伙伴对视频号小店了解不是很深&#xff0c;今天咱们就来详细的说一下&#xff1a;视频号小店&#xff0c; 视频号小店就…

鸿蒙Ability Kit(程序框架服务)【ServiceExtensionAbility】

ServiceExtensionAbility 概述 [ServiceExtensionAbility]是SERVICE类型的ExtensionAbility组件&#xff0c;提供后台服务能力&#xff0c;其内部持有了一个[ServiceExtensionContext]&#xff0c;通过[ServiceExtensionContext]提供了丰富的接口供外部使用。 本文描述中称被…

EasyV开发人员的使用说明书

在可视化大屏项目时&#xff0c;开发人员通常需要承担以下任务&#xff1a; 技术实现&#xff1a;根据设计师提供的设计稿&#xff0c;利用前端技术&#xff08;如HTML、CSS、JavaScript等&#xff09;和后端技术&#xff08;根据具体项目需求&#xff0c;可能是Java、Python、…

【工具】windows下VMware17解锁mac安装选项(使用unlocker427)

目录 0.简介 1.环境 2.安装前后对比 3.详细安装过程 3.1 下载unlocker427 1&#xff09;下载地址 2&#xff09;下载unlocker427.zip 3&#xff09;解压之后是这样的 4&#xff09;复制iso中的两个文件到你本地的VMware的安装目录下 5&#xff09;复制windows下的所有…

计网期末复习指南(四):网络层(IP协议、IPv4、IPv6、CIDR、ARP、ICMP)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算…

学生在课堂上可以用小风扇吗?五款学生可用迷你手持小风扇分享!

随着夏季的来临&#xff0c;高温酷暑成为了学生日常学习生活中的一大挑战。在闷热的教室里&#xff0c;人多风扇少&#xff0c;闷热的环境很容易就会让人学不下去。因此学生在课堂上最好是使用手持小风扇&#xff0c;但选择的手持小风扇噪音一定要小&#xff0c;不然很容易就会…

HarmonyOS(29)onMeasureSize和PlaceChildren (View的测量和布局)

onMeasureSize和PlaceChildren onMeasureSize和PlaceChildren 说明官方使用示例参考资料 onMeasureSize和PlaceChildren 说明 在Android开发中View的测量onMeasure和布局onLayout是自定义组件必备的两个方法&#xff0c;HarmonyOS对自定义布局也提供了两个方法&#xff1a; on…

面试题:谈谈你对 JS 内存泄漏与内存溢出的理解

面试题&#xff1a;谈谈你对 JS 内存泄漏与内存溢出的理解 内存泄漏&#xff08;Memory Leak&#xff09;指的是程序不需要使用的内存没有被正确释放&#xff0c;从而导致内存占用逐渐增加&#xff0c;最终可能会耗尽所有可用内存。 内存泄漏即不想用的内存没被释放 内存溢出&a…

【VSCode实战】转换大小写快捷键

今天在VSCode Insiders上编码&#xff0c;突然想将某常量转换为大写。按照virtual studio的习惯&#xff0c;我Ctrl Shift U没有效果&#xff0c;Ctrl U也没效果。网上搜了搜&#xff0c;原来VSCode Insiders没有这个默认功能。 而VSCode Insiders这么强大怎么可能没有大小…

ELK 使用 metricbeat监控数据

IP功能版本192.168.140.153elk-18.13.4192.168.140.153metricbeat8.13.4192.168.140.156elk-28.13.4192.168.140.156metricbeat8.13.4192.168.140.159logstash8.13.4192.168.140.159kibana8.13.4 一、安装ELK 参考文档&#xff1a; https://download.csdn.net/download/weix…

TG-5510CA温补晶振用于GPS应用

随着现代社会对精准定位和导航需求的不断增加&#xff0c;GPS&#xff08;全球定位系统&#xff09;已成为我们日常生活和各行各业中不可或缺的一部分。无论是在智能手机、汽车导航、无人机飞行控制&#xff0c;还是在精密的科学研究和军事应用中&#xff0c;GPS系统都扮演着至…

爬虫入门教程:爬虫概述

在数字化时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。而如何高效、准确地获取这些数据&#xff0c;成为了许多领域面临的共同问题。今天&#xff0c;我们就来一起探讨一下爬虫技术&#xff0c;这个能够自动从互联网上抓取信息的神奇工具。 一、什么是爬虫…

Android电量优化,让你的手机续航更持久

节能减排&#xff0c;从我做起。一款Android应用如果非常耗电&#xff0c;是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app&#xff0c;一天下来&#xff0c;也没干啥事&#xff0c;电就没了。那么他就会想尽办法找出耗电量杀手&#xff0c;当他找出后&#xff0c…