一、问题描述:
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不能正常排序。