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对象为合并后的对象。