Map和Bean对象之间的转换

Map和Bean对象之间的转换

1,工具
import org.springframework.cglib.beans.BeanMap;

import java.util.HashMap;
import java.util.Map;
public class BeanMapUtils {

    /**
     * 将对象属性转化为map结合
     */
    public static <T> Map<String, Object> beanToMap(T bean) {
        Map<String, Object> map = new HashMap<>();
        if (bean != null) {
            BeanMap beanMap = BeanMap.create(bean);
            for (Object key : beanMap.keySet()) {
                map.put(key+"", beanMap.get(key));
            }
        }
        return map;
    }

    /**
     * 将map集合中的数据转化为指定对象的同名属性中
     */
    public static <T> T mapToBean(Map<String, Object> map,Class<T> clazz) throws Exception {
        T bean = clazz.newInstance();
        BeanMap beanMap = BeanMap.create(bean);
        beanMap.putAll(map);
        return bean;
    }
}

2,反射
import java.lang.reflect.Field;
import java.util.Map;
 
public class BeanUtil {
    public static <T> T mapToBean(Map<String, Object> map, Class<T> clazz) throws Exception {
        T bean = clazz.newInstance();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 允许访问私有字段
            if (map.containsKey(field.getName())) {
                field.set(bean, map.get(field.getName()));
            }
        }
        return bean;
    }
}
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
 
public class BeanUtil {
    public static Map<String, Object> beanToMap(Object bean) throws Exception {
        Map<String, Object> map = new HashMap<>();
        Field[] fields = bean.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 允许访问私有字段
            map.put(field.getName(), field.get(bean));
        }
        return map;
    }
}


3, 使用Apache Commons BeanUtils

Apache Commons BeanUtils库提供了PropertyUtils类,可以方便地处理Bean到Map和Map到Bean的转换。

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version> <!-- 请使用最新版本 -->
</dependency>
import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
 
public class BeanUtil {
    public static <T> T populate(Class<T> type, Map<String, ?> props) throws Exception {
        T bean = type.newInstance(); // 或使用 newInstance() 的替代方法,如 BeanUtils.instantiate() 或 Spring 的 BeanUtils.instantiateClass() 等。
        BeanUtils.populate(bean, props); // 自动设置属性值,属性名必须与Map的key匹配。
        return bean;
    }
}

import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
import java.util.HashMap;
import java.beans.PropertyDescriptor;
import java.beans.Introspector;
import java.beans.IntrospectionException;
import java.lang.reflect.Method;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.stream.Collectors.*;
 
public class BeanUtil {
    public static Map<String, Object> describe(Object bean) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        Class<?> type = bean.getClass();
        PropertyDescriptor[] props = Introspector.getBeanInfo(type, Object.class).getPropertyDescriptors(); 
// 获取所有属性描述符。 包括getter和setter方法描述。 通常getter方法名去掉get后即为属性名。 例如,getter方法为getAge,则属性名为age。 同样,setter方法去掉set后即为属性名。例如,setter方法为setAge,则属性名为age。 若属性名为isXxx,则getter方法为isXxx,setter方法为setXxx。 若属性名为xxx,则getter方法为isXxx,setter方法为setXxx。 若属性名为xxx,则getter方法为getXxx,setter方法为setXxx。 若属性名为xxx,则getter方法为isXxx,setter方法为setXxx。 若属性名为xxx,则getter方法为getXxx,setter方法为setXxx。 若属性名为xxx,则getter方法为isXxx,setter方法为setXxx。 若属性名为xxx,则getter方法为getXxx,setter方法为setX
2.4、利用 apache 中的 BeanUtils 进行转换
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>
 publicclass BeanMapUtilByApache {
 /** 
  * 对象转Map 
  * @param object 
  * @return 
*/ 
public static Map beanToMap(Object object){ 
return new org.apache.commons.beanutils.BeanMap(object); 
 } 
/** 
 * map转对象 
 * @param map 
 * @param beanClass 
 * @param <T> 
 * @return 
*/ 
publicstatic <T> T mapToBean(Map map, Class<T> beanClass) throws Exception { 
 T object = beanClass.newInstance(); org.apache.commons.beanutils.BeanUtils.populate(object, map); 
return object;
  } 
}
2.1、通过 JSON 进行转换

在这里,我们利用阿里巴巴的fastjson包进行转换,通过maven引入 jar,如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.49</version>
</dependency>
publicclass BeanMapUtilByJson {
 
    /**
     * 对象转Map
     * @param object
     * @return
     */
    public static Map beanToMap(Object object){
        return JSONObject.parseObject(JSON.toJSONString(object),Map.class);
    }
 
    /**
     * map转对象
     * @param map
     * @param beanClass
     * @param <T>
     * @return
     */
    publicstatic <T> T mapToBean(Map map, Class<T> beanClass){
        return JSONObject.parseObject(JSON.toJSONString(map),beanClass);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容