java中bean和map互转利用springCglib/apache.beanutils/apache.PropertyUtils工具类,使用反射手写BeanToMap

利用springcore的org.springframework.cglib.beans.BeanMap

  • 这个方法转出来的Map再一次进行put是put不了内容的,需要新new Map().putAll(这个Map)
  • 这里的实体类必需实现get/set方法,不然读不到属性

beanToMap

public static <T> Map<String, ?> beanToMap(T bean) {
    
    
    BeanMap beanMap = BeanMap.create(bean);
    Map<String, Object> map = new HashMap<>();

    beanMap.forEach((key, value) -> {
    
    
        map.put(String.valueOf(key), value);
    });
    return map;
}

在这里插入图片描述
在这里插入图片描述

mapToBean

beanMap 一旦创建出来,后面的值就无法修改了,不管是新增还是修改,而且修改的时候还容易出问题,适合单纯的直接转一下,中间不做任务修改

public void mapToBean(){
    
    
    ObjectMapper mapper = new ObjectMapper();
    Map map = new HashMap();
    map.put("name","12");
    C bean = null;
    BeanMap beanMap = null;
    try {
    
    
        bean = C.class.newInstance();
        beanMap = BeanMap.create(bean);
        beanMap.putAll(map);
    } catch (InstantiationException e) {
    
    
        e.printStackTrace();
    } catch (IllegalAccessException e) {
    
    
        e.printStackTrace();
    }
    System.out.println(bean);
}

接下来是apache的commons-beanutils

先上maven依赖

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>

使用简单,一把梭,不过也是需要get/set方法才能读取到属性的
不过这里有个隐藏坑,这里 BeanUtils.describe 返回的 Map 是 final 的就是不能变的
而且读取出来的Map的value都是String的不管之前javaBean的Type是啥

public void testBeanToMapApache(){
    
    
    try {
    
    
        System.out.println(BeanUtils.describe(new C()));
    } catch (IllegalAccessException e) {
    
    
        e.printStackTrace();
    } catch (InvocationTargetException e) {
    
    
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
    
    
        e.printStackTrace();
    }
}

在这里插入图片描述
在这里插入图片描述

apache的commons-beanutils的mapToBean

public void testMapToBeanApache(){
    
    
    Map map = new HashMap();
    map.put("name","12");
    C bean = null;
    try {
    
    
        bean = C.class.newInstance();
        BeanUtils.populate(bean,map);
    } catch (InstantiationException e) {
    
    
        e.printStackTrace();
    } catch (IllegalAccessException e) {
    
    
        e.printStackTrace();
    } catch (InvocationTargetException e) {
    
    
        e.printStackTrace();
    }
}

apache的org.apache.commons.beanutils.PropertyUtils.describe还是这个香(推荐)

beanToMap

这个工具类转出来的Mapvalue是没有做处理的,原来是啥类型还是啥类型
不过它返回的也是一个finalMap
在这里插入图片描述

public void testBeanToMapApache(){
    
    
try {
    
    
    System.out.println(PropertyUtils.describe(new C()));
} catch (IllegalAccessException e) {
    
    
    e.printStackTrace();
} catch (InvocationTargetException e) {
    
    
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    
    
    e.printStackTrace();
}
}

使用反射手写BeanToMap

public void test() throws IllegalAccessException {
    
    
    C c = new C();

    Map<String, Object> map = new HashMap<String, Object>();

    //Class cls = obj.getClass();
    Class cls = C.class;
    import java.lang.reflect.Field[] fields = cls.getDeclaredFields();
    for (Field field : fields) {
    
    
        //当isAccessible()的结果是false时不允许通过反射访问该字段
        //当该字段时private修饰时isAccessible()得到的值是false,必须要改成true才可以访问
        //setAccessible(true);得作用就是让我们在用反射时访问私有变量
        field.setAccessible(true);
        map.put(field.getName(), field.get(c));
    }
    System.out.println(map);
}

反射mapToBean

public void test() throws InstantiationException, NoSuchFieldException, IllegalAccessException {
    
    
    Map<String,Object> map = new HashMap();
    map.put("name","12");
    Object object = C.class.newInstance();
    for (String key : map.keySet()){
    
    
        Field temFiels = C.class.getDeclaredField(key);
        temFiels.setAccessible(true);
        temFiels.set(object, map.get(key));
    }
    System.out.println(object);
}

猜你喜欢

转载自blog.csdn.net/weixin_43944305/article/details/113763047