BeanUtils 属性修改

1、背景

在项目过程中遇到一个小问题,第一次传输的数据为全量数据,存储到数据库中,第二次传递为增量数据,需要增量合并到第一条数据上进行存储

2、解决办法:

使用BeanUtils工具类进行,参数类进行属性修改,自定义工具类:

package com.test.service.utils;
​
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
​
public class BeanUtils {
    /**
     * 属性信息
     */
    private static final Map<Class, Map<String, PropertyDescriptor>> classPropertyMap = new HashMap<>();
​
    /**
     * 属性修改
     *
     * @param dest 被修改属性的对象
     * @param sour 源对象
     * @param changeProperties 需修改的属性
     * @return void
     */
    public static void modifyProperties(Object dest, Object sour, List<String> changeProperties) {
        if (changeProperties == null) {
            return;
        }
        Map<String, PropertyDescriptor> descPropertyMap = getPropertyMap(dest.getClass());
        Map<String, PropertyDescriptor> sourPropertyMap = getPropertyMap(sour.getClass());
        changeProperties.forEach(s -> {
            try {
                descPropertyMap.get(s).getWriteMethod()
                    .invoke(dest, sourPropertyMap.get(s).getReadMethod().invoke(sour));
            } catch (IllegalAccessException e) {
                //TODO 异常处理
            } catch (InvocationTargetException e) {
                //TODO 异常处理
            }
        });
    }
​
    /**
     * 获取类的属性信息
     *
     * @param clazz 类名
     * @return Map<PropertyDescriptor>
     */
    public static Map<String, PropertyDescriptor> getPropertyMap(Class clazz) {
        Map<String, PropertyDescriptor> propertyMap;
        if ((propertyMap = classPropertyMap.get(clazz)) == null) {
            synchronized (clazz) {
                if ((propertyMap = classPropertyMap.get(clazz)) == null) {
                    final Map<String, PropertyDescriptor> finalPropertyMap = new HashMap<>();
                    propertyMap = finalPropertyMap;
                    try {
                        Arrays.asList(Introspector.getBeanInfo(clazz).getPropertyDescriptors())
                            .forEach(s -> finalPropertyMap.put(s.getName(), s));
                    } catch (IntrospectionException e) {
                        //TODO 异常处理
                    }
                    classPropertyMap.put(clazz, propertyMap);
                }
            }
        }
        return propertyMap;
    }
​
}
​

调用方法演示:

BeanUtils.modifyProperties(dest, sour, changePorpoties);
​
// dest 被修改属性的对象
// sour 源对象
// changeProperties 需修改的属性 操作变化项

执行后,得到的dest对象为合并后的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!如果您想在使用BeanUtils.copyProperties方法时处理属性称不同的情况,您可以尝试使用BeanWrapper接口来实现自定义的属性复制逻辑。 首先,您需要创建源对象和目标对象的实例。然后,通过BeanWrapper来包装这两个对象。接下来,您可以使用BeanWrapper的getPropertyValue和setPropertyValue方法来获取和设置属性。 在复制属性时,您可以使用BeanWrapper的getPropertyDescriptors方法来获取源对象的所有属性描述符。然后,遍历这些属性描述符,对每个属性进行处理。通过调用源对象的getPropertyValue方法获取源属性,然后使用目标对象的setPropertyValue方法将该设置到目标属性中。 需要注意的是,您需要根据属性称的不同,编写适合的转换逻辑。例如,您可以使用条件语句或者自定义的映射表来处理不同称的属性。 下面是一个简单示例代码,演示如何处理属性称不同的情况: ```java import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; public class CustomBeanUtils { public static void copyProperties(Object source, Object target) { BeanWrapper srcWrapper = new BeanWrapperImpl(source); BeanWrapper targetWrapper = new BeanWrapperImpl(target); PropertyDescriptor[] descriptors = srcWrapper.getPropertyDescriptors(); for (PropertyDescriptor descriptor : descriptors) { String srcPropertyName = descriptor.getName(); String targetPropertyName = getTargetPropertyName(srcPropertyName); if (srcWrapper.isReadableProperty(srcPropertyName) && targetWrapper.isWritableProperty(targetPropertyName)) { Object value = srcWrapper.getPropertyValue(srcPropertyName); targetWrapper.setPropertyValue(targetPropertyName, value); } } } private static String getTargetPropertyName(String srcPropertyName) { // 自定义属性称转换逻辑 // 根据源属性称返回目标属性称 // 可以使用条件语句或映射表来处理不同称的属性 // 这里只是简单示范,将属性称转换为大写 return srcPropertyName.toUpperCase(); } } ``` 您可以根据自己的具体业务需求,修改getTargetPropertyName方法中的属性称转换逻辑。 使用示例: ```java SourceObject source = new SourceObject(); TargetObject target = new TargetObject(); CustomBeanUtils.copyProperties(source, target); ``` 希望这可以帮助到您!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值