用于bean和map互转,用到的情况比较少。可以的话采用json为中介可以实现这个功能,但是还是存在部分情况下可以采用这个方法,例如:部分json转bean的时候,若bean没有对应属性,则会报错。
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.math.NumberUtils;
import javax.persistence.Column;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
public class BeanMapUtil {
private final static Logger logger = Logger.getLogger(BeanMapUtil.class.toString());
private final static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private final static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
public static <T> T mapToBean(Map<String, Object> map, Class<T> beanClass) {
if (MapUtils.isEmpty(map)) {
return null;
}
try {
T t = beanClass.newInstance();
Field[] fields = null;
fields = t.getClass().getDeclaredFields();
for (Field field : fields) {
Column column=field.getAnnotation(Column.class);
field.setAccessible(true);
if(column!=null){
setFiled(t, field, map.get(column.name()));
}else{
setFiled(t, field, map.get(field.getName()));
}
}
return t;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException();
}
}
private static void setFiled(Object t, Field filed,Object value) throws Exception{
filed.setAccessible(true);
if(value != null){
if(filed.getType().toString().endsWith("Integer") || filed.getType().toString().equals("int")){
filed.set(t, Integer.parseInt(value.toString()));
}else if(filed.getType().toString().endsWith("Short") || filed.getType().toString().equals("short")){
filed.set(t, Short.parseShort(value.toString()));
}else if(filed.getType().toString().endsWith("Boolean") || filed.getType().toString().equals("boolean")){
filed.set(t, Boolean.parseBoolean(value.toString()));
}else if(filed.getType().toString().endsWith("Double") || filed.getType().toString().equals("double")){
filed.set(t, Double.parseDouble(value.toString()));
}else if(filed.getType().toString().endsWith("Date")){
if(value instanceof Long){
filed.set(t,new Date((Long)value));
}else if(value instanceof String){
if(NumberUtils.isNumber(String.valueOf(value))){
filed.set(t,new Date(Long.parseLong((String)value)));
}else{
Date date = null;
try {
date = dateTimeFormat.parse((String)value);
}catch(Exception e ){
try{
date = dateFormat.parse((String)value);
}catch (Exception e2){}
}
filed.set(t, date);
}
}
}else{
filed.set(t, (filed.getType().cast( value )));
}
}
}
public <T> T cast(Object obj) {
return (T) obj;
}
/**
* 使用Introspector,对象转换为map集合
*
* @param beanObj javabean对象
* @return map集合
*/
public static Map<String, Object> beanToMap(Object beanObj) {
if (null == beanObj) {
return null;
}
Map<String, Object> map = new HashMap<>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(beanObj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
if (key.compareToIgnoreCase("class") == 0) {
continue;
}
Method getter = property.getReadMethod();
Object value = getter != null ? getter.invoke(beanObj) : null;
map.put(key, value);
}
return map;
} catch (Exception ex) {
throw new RuntimeException();
}
}
}