一、问题描述:

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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部