package com.pactera.customer.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author
* @date 2020-08-20 16:46
* @description
*/
public class ReflexUtils {
private static final String GET = "get";
private static final String SET = "set";
/**
* 使用反射机制把map中的key和value转换成对象的属性值
* @param map
* @param clazz
* @return
* @throws Exception
*/
public static Object mapToObject(Map<String, Object> map, Class<?> clazz) throws Exception {
Object obj = clazz.newInstance();
if (map != null && map.size() > 0) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
String propertyName = entry.getKey();
Object value = entry.getValue();
Field field = getClassField(clazz, propertyName);
if (field == null) {
continue;
}
// 获取字段类型
Class<?> fieldType = field.getType();
// 根据字段类型名称进行值的转换
value = convertValType(value, fieldType.getName());
try {
// 调用对象对应的set方法
clazz.getMethod(setMethod(propertyName), field.getType()).invoke(obj, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
return obj;
}
/**
* 根据名称获取对象里对应的字段
* @param clazz
* @param fieldName
* @return
*/
private static Field getClassField(Class<?> clazz, String fieldName) {
if (Object.class.getName().equals(clazz.getName())) {
return null;
}
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getName().equals(fieldName)) {
return field;
}
}
Class<?> superClass = clazz.getSuperclass();
if (superClass != null) {
return getClassField(superClass, fieldName);
}
return null;
}
/**
* 根据对象的属性类型进行值转换
* @param value
* @param name
* @return
*/
private static Object convertValType(Object value, String name) {
Object retVal = null;
if (List.class.getName().equals(name)) {
retVal = Arrays.asList(value.toString().split(","));
} else if (Map.class.getName().equals(name)) {
JSONObject jsonObject = JSONObject.parseObject(value.toString());
retVal = (Map) JSON.parse(jsonObject.toString());
} else if (Boolean.class.getName().equals(name)) {
retVal = Boolean.parseBoolean(value.toString());
} else if (Long.class.getName().equals(name)
|| long.class.getName().equals(name)) {
retVal = Long.parseLong(value.toString());
} else if (Integer.class.getName().equals(name)
|| int.class.getName().equals(name)) {
retVal = Integer.parseInt(value.toString());
} else if (Float.class.getName().equals(name)
|| float.class.getName().equals(name)) {
retVal = Float.parseFloat(value.toString());
} else if (Double.class.getName().equals(name)
|| double.class.getName().equals(name)) {
retVal = Double.parseDouble(value.toString());
} else {
retVal = value.toString();
}
return retVal;
}
/**
* 根据字段名转换成get方法名
* @param name
* @return
*/
private static String getMethod(String name) {
return GET + name.substring(0, 1).toUpperCase() + name.substring(1);
}
/**
* 根据字段名转换set方法名
* @param name
* @return
*/
private static String setMethod(String name) {
return SET + name.substring(0, 1).toUpperCase() + name.substring(1);
}
}
TestConfig类
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* @author
* @date 2020-08-19 16:35
* @description
*/
@Data
public class TestConfig implements Serializable {
private static final long serialVersionUID = 6450374975609096968L;
/**
* 索引名称
*/
private String index;
/**
* 分组字段名
*/
private String groupName;
/**
* 查询数据返回列
*/
private List<String> includes;
/**
* 查询数据排除列
*/
private List<String> excludes;
/**
* 转换数据所对应的key(当返回数据需要再封装一层时需设置)
*/
private String convertKey;
/**
* 字段名转换(字段名重新定义主要用于返回给前端)
* 第一个String为ES索引中的字段名称,第二个String为返回给前端的字段名称
*/
private Map<String,String> convert;
/**
* 需要多个索引进行对比数据的配置项
*/
private Map<String, Object> contrast;
/**
* 默认值查询条件
*/
private Map<String, Object> defaultValue;
/**
* 给有需要同一标题数据的列表设置字段转换
*/
private Map<String, String> titleConvert;
}
使用方法
TestConfig testConfig = (TestConfig ) ReflexUtils.mapToObject(map, TestConfig.class);
可使用于项目当中读取数据库动态配置进行做逻辑处理