一、问题描述:
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不能正常排序。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 递归出java实体类中所有带@Schema注解且有复杂类型属性List<T>泛型类型
发表评论 取消回复