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);
}
}