java通过反射完成两个对象之间的属性拷贝(支持继承)以及使用Gson进行对象属性拷贝

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36666651/article/details/81241278

java通过反射可以获取到类的所有信息,由此我们可以进行很多操作。

下面是通过java反射完成两个不同对象之间的字段值拷贝的示例:
首先,通过反射获取所有的字段(包含父类),然后进行字段的赋值

/**
     * 复制字段的值
     * @param source 源对象
     * @param target 目标对象
     * @param skipFieldNames 过滤的字段
     */
    public static void copyFields(Object source, Object target, String[] skipFieldNames){
        Set<String> skips = new HashSet<>();
        if (skipFieldNames != null){
            skips.addAll(Arrays.asList(skipFieldNames));
        }
        HashMap<String, Field> sourceFieldMap = getAllFields(source);
        HashMap<String, Field> targetFieldMap = getAllFields(target);

        sourceFieldMap.forEach((key, value) -> {
            value.setAccessible(true);
            try {
                if (value.get(source) != null && !skips.contains(key) && targetFieldMap.containsKey(key)){
                    targetFieldMap.get(key).setAccessible(true);
                    targetFieldMap.get(key).set(target, value.get(source));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 获取对象所有的字段 包括父类
     * @param obj 对象
     * @return 字段名与Field对象的映射map
     */
    private static HashMap<String, Field> getAllFields(Object obj){
        Class sourceClass = obj.getClass();
        //获取对象所有字段 包括父类
        ArrayList<Field> sourceFields = new ArrayList<>();
        while (sourceClass != null){
            sourceFields.addAll(Arrays.asList(sourceClass.getDeclaredFields()));
            sourceClass = sourceClass.getSuperclass();
        }
        //字段名去重
        HashMap<String, Field> sourceFieldMap = new HashMap<>(16);
        for (Field field : sourceFields){
            sourceFieldMap.put(field.getName(), field);
        }
        return sourceFieldMap;
    }

下面是使用Gson进行对象之间的属性拷贝:
GsonUtil类见这里写链接内容

/**
     * 将对象值赋值给目标对象
     * @param source 源对象
     * @param <T> 目标对象类型
     * @return 目标对象实例
     */
    public static <T> T convert(Object source, Class<T> clz){
        String json = GsonUtil.toJsonFilterNullField(source);
        return GsonUtil.fromJson(json, clz);
    }

猜你喜欢

转载自blog.csdn.net/qq_36666651/article/details/81241278
今日推荐