欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 递归出java实体类中所有带@Schema注解且有复杂类型属性List<T>泛型类型

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

2025/10/19 8:00:00 来源:https://blog.csdn.net/yang1076180972/article/details/139436878  浏览:    关键词:递归出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不能正常排序。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词