利用 JAVA 反射机制将列表转为对象 或将对象转为列表

利用 JAVA 反射机制将列表转为对象

注意:对象中的实体Bean、List等非简单类型字段 不能直接转化,需再次调用。

public class TransitionUtil {

    //字段属性中的get、set方法前缀
    private static final String GET = "get";
    private static final String SET = "set";
    //过滤非简单类型字段 不转化 多个字段使用,分割
    private static final String CLASSNAME = "productList,orderList";

    /**
     * 使用反射机制把map中的key和value转换成对象的属性值
     *
     * @param list Bean-为你原始List的对象类名称
     * @param clazz
     * @return
     * @throws Exception
     */
    public <T> T keyListToBean(List<Bean> list, Class<T> clazz) {
        try {
            T obj = clazz.getDeclaredConstructor().newInstance();
            if (CollectionUtils.isNotEmpty(list)) {
                for (Bean entry : list) {
                    //清修改为对应list中的字段
                    String propertyName = entry.getField();
                     //清修改为对应list中的字段
                    Object value = entry.getFieldValue();
                    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;
        } catch (Exception e) {
            e.printStackTrace();
            log.error(">>> 结构化数据转为Bean错误:{}", e.getMessage());
        }
        return null;
    }


    /**
     * 根据名称获取对象里对应的字段
     *
     * @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 (CLASSNAME.contains(field.getName())) {
                continue;
            }
            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 = JSON.parse(jsonObject.toString());
        } else if (Boolean.class.getName().equals(name)
                || 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 == null || "null".equals(value) || "".equals(value) ? "0" : value.toString());
        } else if (Integer.class.getName().equals(name)
                || int.class.getName().equals(name)) {
            retVal = Integer.parseInt(value == null || "null".equals(value) || "".equals(value) ? "0" : value.toString());
        } else {
            retVal = value == null ? "" : String.valueOf(value);
        }
        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);
    }

    /**
     * 将Object对象里面的属性和值转化成Map对象
     *
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public List<Bean> objectToKeyList(Object obj, Integer contractId, Map<String, String> categoryMap, Integer groupId, Integer contentId, Integer oid) throws IllegalAccessException {
        List<Bean> list = new ArrayList<>();
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            if (CLASSNAME.contains(field.getName())) {
                continue;
            }
            field.setAccessible(true);
            String categoryType = categoryMap.get(field.getName()) == null ? "" : categoryMap.get(field.getName());
            if (StringUtils.isEmpty(categoryType)) {
                categoryType = "commonCategory";
            }
            //需要转化的bean 名称
            Bean  info = Bean.newBuilder()
                    .setFieldId(contractId == null ? 0 : contractId)
                    .setFieldType(categoryType)
                    .setField("shopMerchantId".equals(field.getName()) ? "merchantId" : field.getName())
                    .setFieldValue(String.valueOf(field.get(obj) == null ? "" : field.get(obj)))
                    .setGroupId(groupId)
                    .setContentId(contentId)
                    .setOid(oid)
                    .build();
            list.add(info);
        }
        return list;
    }
}

你可能感兴趣的:(工具类,java,jvm,开发语言)