
org.sdn.api.utils.ObjectToMap Maven / Gradle / Ivy
package org.sdn.api.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
* 对象属性转成map
*
* Bean 转Map对象 set get方法
*
* @author:fulong
* @create:2018/11/16 17:48.
*/
public class ObjectToMap {
private static Logger logger = LoggerFactory.getLogger(ObjectToMap.class);
/**
* 类属性缓存
*/
private static final ConcurrentHashMap, Field[]> CLASS_CACHE = new ConcurrentHashMap<>(64);
public static Map objectToMap(Object obj) throws Exception {
if (obj == null) {
return null;
}
Map map = new HashMap<>();
BeanInfo beanInfo = Introspector.getBeanInfo(obj.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(obj) : null;
map.put(key, value);
}
return map;
}
/**
* Bean对象属性转换成 map
*
* @param obj
* @return
*/
public static Map toMap(Object obj) {
Field[] fields = getFields(obj);
if (Objects.isNull(fields)) {
return null;
}
int size = (int) Math.ceil((fields.length) / 0.75);
Map params = new HashMap<>(size);
for (Field field : fields) {
try {
String name = field.getName();
//不是get方法时,不进行获取
Object value = field.get(obj);
if (Objects.isNull(value)) {
continue;
}
params.put(name, value);
} catch (Exception e) {
logger.info(" ObjectToMap toMap() Exception error={}",e);
}
}
return params;
}
/**
* 获取到属性 该方法不处理父类属性
*
* @param obj
* @return
*/
private static Field[] getFields(Object obj) {
if (Objects.isNull(obj)) {
return null;
}
//获得类
Class clazz = obj.getClass();
Field[] fields = CLASS_CACHE.get(clazz);
if (fields != null) {
return fields;
}
// 获取实体类的所有属性信息,返回Field数组
fields = clazz.getDeclaredFields();
CLASS_CACHE.putIfAbsent(clazz, fields);
for (Field field : fields) {
field.setAccessible(true);
}
return fields;
}
}