1、实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: JSONLiu
* @Description:
* @Date Created in 2021-11-17 16:27
* @Modified By:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EnumTransform{
/**
* 源类型字段
*/
private String sourceType;
/**
* 源类型名称
*/
private String sourceName;
/**
* 目标枚举
*/
private Class targetEnum;
/**
* 目标类型字段
*/
private String targetType;
/**
* 目标类型字段
*/
private String targetName;
}
2、枚举值转换方法
import com.zbzk.cmp.core.entity.base.EnumTransform;
import java.lang.reflect.Method;
import java.util.EnumSet;
import java.util.List;
/**
* @Author: JSONLiu
* @Description: 更新对象中枚举的name值
* @Date Created in 2021-11-17 16:07
* @Modified By:
*/
public class EnumUtil {
/**
* 更新list集合中枚举的name值
*
* @param list 源数据列表
* @param enumTransforms 转换的枚举对象
* @param <T>
* @throws Exception
*/
public static <T> void setEnumName(List<T> list, List<EnumTransform> enumTransforms) throws Exception {
if (list == null) return;
if (enumTransforms == null) return;
for (T t : list) {
setEnumName(t, enumTransforms);
}
}
/**
* 更新对象中枚举的name值
*
* @param t
* @param enumTransforms
* @param <T>
* @throws Exception
*/
public static <T> void setEnumName(T t, List<EnumTransform> enumTransforms) throws Exception {
if (t == null) return;
if (enumTransforms == null) return;
for (EnumTransform enumTransform : enumTransforms) {
//查找的源值
Object sourceTypeVal = getMethodValue(t, enumTransform.getSourceType());
//获取的目标值
Object enumValue = getEnumValue(enumTransform.getTargetEnum(), sourceTypeVal, enumTransform.getTargetType(), enumTransform.getTargetName());
//设置目标值
setMethodValue(t, enumTransform.getSourceName(), enumValue == null ? "" : enumValue);
}
}
/**
* 查找enum值
*
* @param clazz enum类型
* @param sourceValue 查找源值
* @param targetType 查找源值:目标字段
* @param targetName 返回 目标字段
* @param <E>
* @return 返回值
* @throws Exception
*/
private static <E extends Enum<E>> Object getEnumValue(Class<E> clazz, Object sourceValue, String targetType, String targetName) throws Exception {
for (E value : EnumSet.allOf(clazz)) {
Object methodValue = getMethodValue(value, targetType);
if (methodValue.equals(sourceValue)) {
return getMethodValue(value, targetName);
}
}
return null;
}
/**
* 获取对象值
*
* @param t 对象
* @param field 获取的字段
* @param <T>
* @return 获取字段的值
* @throws Exception
*/
private static <T> Object getMethodValue(T t, String field) throws Exception {
field = field.replaceFirst(field.substring(0, 1), field.substring(0, 1).toUpperCase());
Method method = t.getClass().getMethod("get" + field);
return method.invoke(t);
}
/**
* 设置对象值
*
* @param t 对象
* @param field 设置的字段
* @param obj 设置字段值
* @param <T>
* @throws Exception
*/
private static <T> void setMethodValue(T t, String field, Object obj) throws Exception {
Method[] methods = t.getClass().getMethods();
Method setMethod = null;
for (Method method : methods) {
if (method.getName().equalsIgnoreCase("set" + field)) {
setMethod = method;
break;
}
}
if (setMethod == null) return;
setMethod.invoke(t, obj);
}
}
3、示例
try {
List<EnumTransform> enumTransforms = new ArrayList<>();
EnumTransform enumTransform = new EnumTransform("bizFunction", "bizFunctionName",
FunctionEnum.class, "id", "name");
enumTransforms.add(enumTransform);
EnumUtil.setEnumName(list, enumTransforms);
} catch (Exception e) {
logger.error(e.toString());
}
- “bizFunction”, “bizFunctionName” 为 list集合中需要去枚举中查找的类型,以及查找返回后更新的值
- FunctionEnum.class 为查找的枚举类型,
- “id”, “name” 为枚举中的值和名称