package com.vci.starter.web.util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.util.*;
/**
* 业务类型专用的拷贝工具,这个是浅拷贝,
* @author weidy
* @date 2022-1-18
*/
public class BeanUtilForVCI {
/**
* 日志
*/
private static Logger logger = LoggerFactory.getLogger(BeanUtilForVCI.class);
/**
* 拷贝数据
* 大小写可以忽略
* 下划线 _ 被忽略
* null和空字符串的也会被覆盖
* @param source 来源属性
* @param target 目标属性
*/
public static void copyPropertiesIgnoreCase(Object source, Object target) {
copyPropertiesIgnoreCase(source,target,false);
}
/**
* 拷贝属性
* @param source 源对象
* @param target 目标对象
* @param fieldMap 属性的映射
*/
public static void copyPropertiesIgnoreCase(Object source,Object target,Map fieldMap){
copyPropertiesIgnoreCase(source,target,false,fieldMap);
}
/**
* 拷贝数据
* 大小写可以忽略
* 下划线 _ 被忽略
* @param source 来源属性
* @param target 目标属性
* @param ignoreNull 是否忽略控制
*/
public static void copyPropertiesIgnoreCase(Object source,Object target,boolean ignoreNull){
copyPropertiesIgnoreCase(source, target, ignoreNull,null);
}
/**
* 拷贝本体的属性内容
* @param source 来源对象
* @param target 目标对象
*/
public static void copyDeclaredIgnoreCase(Object source,Object target){
copyDeclaredIgnoreCase(source,target,false);
}
/**
* 拷贝本体的属性内容
* @param source 来源对象
* @param target 目标对象
* @param ignoreNull 忽略空值的属性
*/
public static void copyDeclaredIgnoreCase(Object source,Object target,boolean ignoreNull){
copyDeclaredIgnoreCase(source,target,ignoreNull,null);
}
/**
* 拷贝本体的属性内容
* @param source 来源对象
* @param target 目标对象
* @param ignoreNull 忽略空值的属性
* @param fieldMap 字段的映射
*/
public static void copyDeclaredIgnoreCase(Object source,Object target,boolean ignoreNull,Map fieldMap){
copyDeclaredIgnoreCase(source,target,ignoreNull,fieldMap,null);
}
/**
* 拷贝本体的属性内容
* @param source 来源对象
* @param target 目标对象
* @param ignoreNull 忽略空值的属性
* @param fieldMap 字段的映射
* @param ignoreField 忽略字段
*/
public static void copyDeclaredIgnoreCase(Object source,Object target,boolean ignoreNull,Map fieldMap,Collection ignoreField){
Map sourceMap = CacheFieldMap.getDeclaredFieldMap(source.getClass());
Map targetMap = CacheFieldMap.getDeclaredFieldMap(target.getClass());
copyPropertiesIgnoreCase(source,target,ignoreNull,fieldMap,ignoreField,sourceMap,targetMap);
}
/**
* 拷贝数据
* 大小写可以忽略
* 下划线 _ 被忽略
* @param source 来源属性
* @param target 目标属性
* @param ignoreNull 是否忽略控制
*/
public static void copyPropertiesIgnoreCase(Object source, Object target, boolean ignoreNull, Map fieldMap, Collection ignoreField) {
Map sourceMap = CacheFieldMap.getFieldMap(source.getClass());
Map targetMap = CacheFieldMap.getFieldMap(target.getClass());
copyPropertiesIgnoreCase(source,target,ignoreNull,fieldMap,ignoreField,sourceMap,targetMap);
}
/**
* 拷贝数据
* 大小写可以忽略
* 下划线 _ 被忽略
* @param source 来源属性
* @param target 目标属性
* @param ignoreNull 是否忽略控制
*/
public static void copyPropertiesIgnoreCase(Object source, Object target, boolean ignoreNull,
Map fieldMap, Collection ignoreField,
Map sourceMap,Map targetMap ) {
if(fieldMap == null){
fieldMap = new HashMap<>();
}
Map finalFieldMap = fieldMap;
targetMap.values().forEach((it) -> {
boolean not = false;
if(ignoreField!=null && ignoreField.contains(it.getName())){
not = true;
}
if(!not) {
String itFieldName = it.getName().toLowerCase().replace("_", "");
itFieldName = finalFieldMap.getOrDefault(itFieldName, itFieldName);
Field field = sourceMap.getOrDefault(itFieldName, null);
if (field != null) {
it.setAccessible(true);
field.setAccessible(true);
try {
//忽略null和空字符串
//处理boolean和String
String sourceClassName = field.getClass().getName();
String targetClassName = it.getClass().getName();
if (((sourceClassName.equalsIgnoreCase(Boolean.class.getName())
|| sourceClassName.equalsIgnoreCase(boolean.class.getName())
) && targetClassName.equalsIgnoreCase(String.class.getName()))
|| ((targetClassName.equalsIgnoreCase(Boolean.class.getName())
|| targetClassName.equalsIgnoreCase(boolean.class.getName()))
&& sourceClassName.equalsIgnoreCase(String.class.getName()))) {
if (targetClassName.equalsIgnoreCase(String.class.getName())) {
it.set(target, String.valueOf((Boolean) field.get(source)));
} else {
it.set(target, Boolean.valueOf((String) field.get(source)));
}
} else {
if (!ignoreNull) {
it.set(target, field.get(source));
} else {
//需要判断是否为空
Object sourceValue = field.get(source);
if (sourceValue != null && StringUtils.isNotBlank(sourceValue.toString())) {
it.set(target, sourceValue);
}
}
}
} catch (IllegalAccessException e) {
if (logger.isErrorEnabled()) {
logger.error("拷贝属性出错" + e);
}
}
}
}
});
}
/**
* 拷贝数据
* 大小写可以忽略
* 下划线 _ 被忽略
* @param source 来源属性
* @param target 目标属性
* @param ignoreNull 是否忽略控制
*/
public static void copyPropertiesIgnoreCase(Object source,Object target,boolean ignoreNull,Map fieldMap){
copyPropertiesIgnoreCase(source,target,ignoreNull,fieldMap,null);
}
/**
* 缓存对象的属性
*/
private static class CacheFieldMap {
/**
* 对象属性的缓存
*/
private static Map> cacheMap = new HashMap<>();
/**
* 对象的自己类的环境,不包括父类
*/
private static Map> declaredCacheMap = new HashMap<>();
/**
* 获取属性的映射
* @param clazz 类
* @return 属性名称小写和属性的映射
*/
private static Map getFieldMap(Class clazz) {
Map result = cacheMap.get(clazz.getName());
if (result == null) {
synchronized (CacheFieldMap.class) {
if (result == null) {
Map fieldMap = new HashMap<>();
List allFields = VciBaseUtil.getAllFieldForObj(clazz);
if(!CollectionUtils.isEmpty(allFields)){
allFields.stream().forEach(field -> {
fieldMap.put(field.getName().toLowerCase().replace("_", ""), field);
});
}
cacheMap.put(clazz.getName(), fieldMap);
result = cacheMap.get(clazz.getName());
}
}
}
return result;
}
/**
* 获取属性的映射(不包含父类)
* @param clazz 类
* @return 属性名称小写和属性的映射
*/
private static Map getDeclaredFieldMap(Class clazz){
Map result = declaredCacheMap.get(clazz.getName());
if(result == null){
synchronized(CacheFieldMap.class){
if (result == null) {
Map fieldMap = new HashMap<>();
Field[] allFields = clazz.getDeclaredFields();
if(allFields!=null && allFields.length>0){
Arrays.stream(allFields).forEach(field -> {
fieldMap.put(field.getName().toLowerCase().replace("_", ""), field);
});
}
declaredCacheMap.put(clazz.getName(), fieldMap);
result = declaredCacheMap.get(clazz.getName());
}
}
}
return result;
}
}
}