package com.camnter.newlife.utils;
import com.alibaba.fastjson.annotation.JSONField;
import com.camnter.newlife.utils.annotation.Exclude;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class MapUtils {
/**
* 返回由对象的属性为key,值为map的value的Map集合
* 针对gson 加入 SerializedName 以及
* 自定义 Exclude
* 暂时只支持一级转换
*
* @param obj Object
* @return mapValue Map<String,String>
* @throws Exception
*/
public static Map<String, Object> getFieldValue(Object obj) {
Map<String, Object> mapValue = new HashMap<>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
Exclude exclude = field.getAnnotation(Exclude.class);
if (exclude != null) {
continue;
}
//针对gson
JSONField serializedName = field.getAnnotation(JSONField.class);
String key;
if (serializedName != null) {
key = serializedName.name();
} else {
key = field.getName();
}
Object value = null;
try {
value = field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (value == null) continue;
mapValue.put(key, value);
}
return mapValue;
}
/**
* 返回由Map的key对属性,value对应值组成的对应
*
* @param map Map<String,String>
* @param cls Class
* @return obj Object
* @throws Exception
*/
public static Object setFieldValue(Map<String, String> map, Class<?> cls) throws Exception {
Field[] fields = cls.getDeclaredFields();
Object obj = cls.newInstance();
for (Field field : fields) {
Class<?> clsType = field.getType();
String name = field.getName();
String strSet = "set" + name.substring(0, 1).toUpperCase() +
name.substring(1, name.length());
Method methodSet = cls.getDeclaredMethod(strSet, clsType);
if (map.containsKey(name)) {
Object objValue = typeConversion(clsType, map.get(name));
methodSet.invoke(obj, objValue);
}
}
return obj;
}
/**
* 将Map里面的部分值通过反射设置到已有对象里去
*
* @param obj Object
* @param data Map<String,String>
* @return obj Object
* @throws Exception
*/
public static Object setObjectFileValue(Object obj, Map<String, String> data) throws Exception {
Class<?> cls = obj.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
Class<?> clsType = field.getType();
String name = field.getName();
String strSet = "set" + name.substring(0, 1).toUpperCase() +
name.substring(1, name.length());
Method methodSet = cls.getDeclaredMethod(strSet, clsType);
if (data.containsKey(name)) {
Object objValue = typeConversion(clsType, data.get(name));
methodSet.invoke(obj, objValue);
}
}
return obj;
}
/**
* 把对象的值用Map对应装起来
*
* @param map Map<String,String>
* @param obj Object
* @return 与对象属性对应的Map Map<String,String>
*/
public static Map<String, String> compareMap(Map<String, String> map, Object obj) {
Map<String, String> mapValue = new HashMap<String, String>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
if (map.containsKey(name)) {
mapValue.put(name, map.get(name));
}
}
return mapValue;
}
/**
* 把临时对象的值复制到持久化对象上
*
* @param oldObject Object 持久化对象
* @param newObject Object 临时对象
* @return 持久化对象
* @throws Exception
*/
public static Object mergedObject(Object oldObject, Object newObject) throws Exception {
Class<?> cls = newObject.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
Class<?> clsType = field.getType();
String name = field.getName();
String method = name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
String strGet = "get" + method;
Method methodGet = cls.getDeclaredMethod(strGet);
Object object = methodGet.invoke(newObject);
if (object != null) {
String strSet = "set" + method;
Method methodSet = cls.getDeclaredMethod(strSet, clsType);
Object objValue = typeConversion(clsType, object.toString());
methodSet.invoke(oldObject, objValue);
}
}
return oldObject;
}
public static Object typeConversion(Class<?> cls, String str) {
Object obj = null;
String nameType = cls.getSimpleName();
if ("Integer".equals(nameType)) {
obj = Integer.valueOf(str);
}
if ("String".equals(nameType)) {
obj = str;
}
if ("Float".equals(nameType)) {
obj = Float.valueOf(str);
}
if ("Double".equals(nameType)) {
obj = Double.valueOf(str);
}
if ("Boolean".equals(nameType)) {
obj = Boolean.valueOf(str);
}
if ("Long".equals(nameType)) {
obj = Long.valueOf(str);
}
if ("Short".equals(nameType)) {
obj = Short.valueOf(str);
}
if ("Character".equals(nameType)) {
obj = str.charAt(1);
}
return obj;
}
}