反射方式 Map转换obj对象
最近接到的需求是这样的,要求我根据一个关联id获取不同数据表的数据,并返回List集合。
我接到这个需求最初想法就是通过mabatis首先获取List<Map<String, Object>>返回值集合; 然后在根据表名称就可以得知实体类对象了,再通过反射的方式进行将map转换为obj。可能有人问我为什么这么转,因为已经获取到了map集合了。在这里我说一下,虽然我获取到了集合但是调用这个接口的开发人员就难受了,因为首先map中的key都是数据库表字段,那相应的开发人员就要通过反射的方式进行获取表字段了,为了方便他人我就在我这里全部都做了,调用方只需要根据实体类强转就可以了。
代码
public static List<Object> mapToObject(List<Map<String, Object>> map,Class<?> clz){
List<Object> list = new ArrayList<>();
map.stream().forEach(el-> {
Object obj = null;
try {
obj = clz.newInstance();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field: fields){
int mod = field.getModifiers();
if(Modifier.isStatic(mod) || Modifier.isFinal(mod)){
continue;
}
field.setAccessible(true);
Column presentColumn;
String columnName;
//判断是否被column注解修饰,获取name属性值
if(field.isAnnotationPresent(Column.class)){
presentColumn = field.getDeclaredAnnotation(Column.class);
columnName = presentColumn.name();
columnName = columnName.replace("`","");
field.set(obj, el.get(columnName));
}
}
list.add(obj);
} catch (Exception e) {
e.printStackTrace();
}
});
return list;
}
说明一下,这个是我再工具类种定义的转换方法。其实思路很简单,就是首先获取反射对象,获取字段,此处说明一下,getFields()是获取所有public修饰的字段,但是正常开发种,字段都是private pri修饰的,所以getDeclaredFields通过该方法获取字段。然后判断是否被static 或者final修饰,然后获取所有被@Column注解修饰的字段,获取column的name属性值,最后进行赋值操作,最后返回List对象。
{
[
{
"id": "00aa6f24ce5c4972b17aa8e49b354435",
"prjViewId": "96f11d75cb61474483b847637a003b81",
"showOrder": 99,
"datavalue": "0",
"rowIndex": "13",
"colIndex": "9",
"mergeRowCount": "0",
"mergeColCount": "0",
"type": "估算"
},
{
"id": "0115d958826e40e88e913a898ac5c084",
"prjViewId": "96f11d75cb61474483b847637a003b81",
"showOrder": 95,
"datavalue": "t",
"rowIndex": "13",
"colIndex": "5",
"mergeRowCount": "0",
"mergeColCount": "0",
"type": "估算"
}
]
总结
一个小白的开发经验,本文仅仅是自己用作以后经验和技术提升的笔记,请勿喷,如果有更好的想法,希望可以分享一下,谢谢。