java比较相同/不同对象中的指定字段是否相同

提供的工具类方法用于比较两个对象的指定字段是否相等,通过反射获取字段值并进行比较。如果字段值不相等,方法将返回错误信息或返回false。此外,还有针对同对象不同实例的比较方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上工具类

	/**
     * 比较不同对象,指定字段是否相等
     *
     * @param obj1  对象1
     * @param obj2  对象2
     * @param fieldNames 需要比较的字段
     * @return 比较结果
     */
    public static String compareDtoFieldsRes(Object obj1, Object obj2, String... fieldNames) {
        if (obj1 == null || obj2 == null) {
            return "校验内容为空";
        }
        for (String fieldName : fieldNames) {
            Object fieldValue1 = ReflectUtils.getFieldValue(obj1, fieldName);
            Object fieldValue2 = ReflectUtils.getFieldValue(obj2, fieldName);
            if (!Objects.equals(fieldValue1, fieldValue2)) {
                return "字段:" + fieldName + "信息有误";
            }
        }
        return null;
    }

    /**
     * 比较不同对象,指定字段是否相等
     *
     * @param obj1  对象1
     * @param obj2  对象2
     * @param fieldNames 需要比较的字段
     * @return 比较结果
     */
    public static boolean compareDtoFields(Object obj1, Object obj2, String... fieldNames) {
        if (obj1 == null || obj2 == null) {
            throw new IllegalArgumentException("比较的对象不能为空");
        }
        for (String fieldName : fieldNames) {
            Object fieldValue1 = ReflectUtils.getFieldValue(obj1, fieldName);
            Object fieldValue2 = ReflectUtils.getFieldValue(obj2, fieldName);
            if (!Objects.equals(fieldValue1, fieldValue2)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 比较同对象不同实例,指定字段是否相等
     *
     * @param obj1  对象1
     * @param obj2  对象2
     * @param fieldNames 需要比较的字段
     * @throws IllegalAccessException
     */
    public static boolean compareObjects(Object obj1, Object obj2, List<String> fieldNames) throws IllegalAccessException {
        if (obj1 == null || obj2 == null) {
            return false;
        }
        if (!obj1.getClass().equals(obj2.getClass())) {
            return false;
        }
        Class<?> clazz = obj1.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            if (Modifier.isStatic(field.getModifiers())) {
                continue;
            }
            if (!fieldNames.contains(field.getName())) {
                continue;
            }
            field.setAccessible(true);
            Object value1 = field.get(obj1);
            Object value2 = field.get(obj2);
            if (value1 == null && value2 == null) {
                continue;
            }
            if (value1 == null || value2 == null) {
                return false;
            }
            if (!value1.equals(value2)) {
                return false;
            }
        }
        return true;
    }


	/**
     * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
     */
    @SuppressWarnings("unchecked")
    public static <E> E getFieldValue(final Object obj, final String fieldName) {
        Field field = getAccessibleField(obj, fieldName);
        if (field == null) {
            log.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
            return null;
        }
        E result = null;
        try {
            result = (E) field.get(obj);
        } catch (IllegalAccessException e) {
            log.error("不可能抛出的异常{}", e.getMessage());
        }
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值