java 通过反射对象赋值

在开发过程中经常需要对接第三方接口来获取数据,第三方接口返回的数据需赋值到实体类当中,一个个 get set 比较麻烦,所以我们就可以使用 java 反射进行对象赋值

 /**
 * description: json 字符 转 pojo 对象
 * create by: Mr.Fang
 *
 * @param json         字符
 * @param config       配置 key JSON字符的key value对应的实体类字段
 *                     Map<String, String> stringStringHashMap = new HashMap<>();
 *                     stringStringHashMap.put("statusDesc", ""); key不为空 value 为空 表示实体类没有该字段
 *                     stringStringHashMap.put("subShareFee", "ccc"); key不为空 value 不为空
 * @param targetObject java 实体类
 * @return: void
 * @date: 2023/11/6 14:39
 */
public static void populateObjectFromJson(String json, Object targetObject, Map<String, String> config) {

    try {
        // 将 JSON 字符转 JSON对象
        JSONObject jsonObject = JSONUtil.strToObj(json, JSONObject.class);

        Class<?> targetClass = targetObject.getClass();
        for (String key : jsonObject.keySet()) {
            // 将 JSON 键从下划线转换为驼峰命名
            String camelCaseKey = convertJsonKeyToCamelCase(key);

            Field field;
            if (Objects.nonNull(config) && config.containsKey(camelCaseKey)) {
                String targetKey = config.get(camelCaseKey);
                if (StringUtils.isEmpty(targetKey)) { // 目标key为空 跳过改字段处理
                    continue;
                }
                field = targetClass.getDeclaredField(targetKey);
            } else {
                field = targetClass.getDeclaredField(camelCaseKey);
            }
            field.setAccessible(true);
            Object jsonValue = jsonObject.get(key);
            if (Objects.isNull(jsonValue)) {
                continue; //数值为空跳过
            }
            // 根据字段类型设置字段的值,同之前的示例
            Class<?> fieldType = field.getType();
            if (fieldType == String.class) {
                field.set(targetObject, jsonValue.toString());
            } else if (fieldType == int.class || fieldType == Integer.class) {
                field.set(targetObject, jsonObject.getIntValue(key));
            } else if (fieldType == boolean.class || fieldType == Boolean.class) {
                field.set(targetObject, jsonObject.getBoolean(key));
            } else if (fieldType == double.class || fieldType == Double.class) {
                field.set(targetObject, jsonObject.getDouble(key));
            } else if (fieldType == Date.class) {
                field.set(targetObject, jsonObject.getDate(key));
            } else if (fieldType == BigDecimal.class) {
                field.set(targetObject, jsonObject.getBigDecimal(key));
            }
            field.setAccessible(false);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * description: json 字符转驼峰命名
 * create by: Mr.Fang
 *
 * @param: [jsonKey]
 * @return: java.lang.String
 * @date: 2023/11/6 14:41
 */
private static String convertJsonKeyToCamelCase(String jsonKey) {

    String[] parts = jsonKey.split("_");
    StringBuilder camelCaseKey = new StringBuilder(parts[0]);
    for (int i = 1; i < parts.length; i++) {
        camelCaseKey.append(StringUtils.capitalize(parts[i]));
    }
    return camelCaseKey.toString();
}