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