Map和Bean對(duì)象之間的轉(zhuǎn)換

Map和Bean對(duì)象之間的轉(zhuǎn)換

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

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

    /**
     * 將對(duì)象屬性轉(zhuǎn)化為map結(jié)合
     */
    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集合中的數(shù)據(jù)轉(zhuǎn)化為指定對(duì)象的同名屬性中
     */
    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的轉(zhuǎn)換。

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version> <!-- 請(qǐng)使用最新版本 -->
</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); // 自動(dòng)設(shè)置屬性值,屬性名必須與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 進(jìn)行轉(zhuǎn)換
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>
 publicclass BeanMapUtilByApache {
 /** 
  * 對(duì)象轉(zhuǎn)Map 
  * @param object 
  * @return 
*/ 
public static Map beanToMap(Object object){ 
return new org.apache.commons.beanutils.BeanMap(object); 
 } 
/** 
 * map轉(zhuǎn)對(duì)象 
 * @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 進(jìn)行轉(zhuǎn)換

在這里,我們利用阿里巴巴的fastjson包進(jìn)行轉(zhuǎn)換,通過maven引入 jar,如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.49</version>
</dependency>
publicclass BeanMapUtilByJson {
 
    /**
     * 對(duì)象轉(zhuǎn)Map
     * @param object
     * @return
     */
    public static Map beanToMap(Object object){
        return JSONObject.parseObject(JSON.toJSONString(object),Map.class);
    }
 
    /**
     * map轉(zhuǎn)對(duì)象
     * @param map
     * @param beanClass
     * @param <T>
     * @return
     */
    publicstatic <T> T mapToBean(Map map, Class<T> beanClass){
        return JSONObject.parseObject(JSON.toJSONString(map),beanClass);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容