更新对象中枚举的name值

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” 为枚举中的值和名称
上一篇:dart系列之:dart语言中的异常


下一篇:要求用缓冲流:java写一个程序,实现从文件中读出文件内容,并将其打印在屏幕当中,并标注上行号