递归出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不能正常排序。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱墩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值