反射常用方法整理

比较两个对象的属性是否进行了修改

    /**
     * 比较两个对象的属性是否被修改
     * 一定要注意如果实体类有序列号值的时候情况
     * @param source 源数据
     * @param target 目标数据
     * @param <T>
     * @return
     */
    public static <T> Object compareFiled(T source, T target) {
        Object object = new Object();//此处的对象换成自己的实际对象,后面也做修改即可
        try {
            Field[] fields = getAllFields(source);
            for (int j = 0; j < fields.length; j++) {
                fields[j].setAccessible(true);
                if (StringUtils.isEmpty(fields[j].get(source))) {
                    //如果修改之后的值为空,对象赋值也为空
                    setValues(fields[j].getName(), fields[j].get(source), object );
                } else if (!fields[j].get(source).equals(fields[j].get(target))) {
                    setValues(fields[j].getName(), fields[j].get(source), object );
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return object;
    }


    /**
     * 获取所有属性,包括父类
     *
     * @param object
     * @return
     */
    public static Field[] getAllFields(Object object) {
        Class clazz = object.getClass();
        List<Field> fieldList = new ArrayList<>();
        while (clazz != null) {
            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
            clazz = clazz.getSuperclass();
        }
        Field[] fields = new Field[fieldList.size()];
        fieldList.toArray(fields);
        return fields;
    }

//私有方法的返回值类型换成实际返回对象,一般与前面保持一致,属性替换各自对象需要比较的属性
    private static Object setValuesInfo(String name, Object value, Object object) {
        switch (name) {
            case "filed1":
                object.setFiled1(value == null ? null : String.valueOf(value));
                break;
            case "filed2":
                object.setFiled2(value == null ? null : String.valueOf(value));
                break;
            case "filed3":
                object.setfFiled3(value == null ? null : String.valueOf(value));
                break;
        }
        return object;
    }

复制同名的field的值从{from} copy 到 {to}

    public static void copy(Object from, Object to) {
        Method[] Methods = from.getClass().getMethods();
        try {
            for (Method method : Methods) {
                if (!method.getName().startsWith("get"))
                    continue;
                String writeMethodName = "s"+ method.getName().substring(1);
                Method writeMethod = null;
                try {
                    writeMethod = to.getClass().getMethod(writeMethodName,
                            method.getReturnType());
                } catch (Exception e) {
                    continue;
                }
                Object value = method.invoke(from);
                writeMethod.invoke(to, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值