比较两个对象参数是否一致

场景

项目中需要将后台更新操作记录到数据库中,并且需要详细记录哪个字段发生改变

思路

大概思路就是使用反射。先获取到更新前后的参数,以更新后参数为比较依据获取属性名,再分别获取更新前后的值进行比较

代码

//比较两个Object类型参数是否一致
public static String compareDiff(Object afterUpdateObject, Object beforeUpdateObject) {
    StringBuilder modifyContent = new StringBuilder();
    if (null == afterUpdateObject || null == beforeUpdateObject) {
        return "";
    }
    Class<?> afterClass = afterUpdateObject.getClass();
    Field[] fields = afterClass.getDeclaredFields();
    for (Field field : fields) {
        String fieldName = field.getName();
        //获取srcField值
        String srcValue = getFieldValue(afterUpdateObject, fieldName) == null ? "" : getFieldValue(afterUpdateObject, fieldName).toString();
        //获取对应的targetField值
        String targetValue = getFieldValue(beforeUpdateObject, fieldName) == null ? "" : getFieldValue(beforeUpdateObject, fieldName).toString();

        if (StringUtils.isEmpty(srcValue) && StringUtils.isEmpty(targetValue)) {
            continue;
        }
        if (!srcValue.equals(targetValue)) {
            modifyContent.append(fieldName).append("由'").append(targetValue).append("'修改为'").append(srcValue).append("';");
        }
    }
    return !modifyContent.toString().equals("") ? modifyContent.toString() : "无更新参数";
}

private static Object getFieldValue(Object obj, String fieldName) {
    Object fieldValue = null;
    if (null == obj) {
        return null;
    }
    String getMethod = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
    Method[] methods = obj.getClass().getDeclaredMethods();
    for (Method method : methods) {
        String methodName = method.getName();
        if (!getMethod.equals(methodName)) {
            continue;
        }
        try {
            fieldValue = method.invoke(obj);
        } catch (Exception e) {
            log.info("取值出错,方法名 " + methodName);
        }
    }
    return fieldValue;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值