反射方式 Map转换obj对象

反射方式 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": "估算"
        } 
      ]

总结

一个小白的开发经验,本文仅仅是自己用作以后经验和技术提升的笔记,请勿喷,如果有更好的想法,希望可以分享一下,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值