public class BeanConverUtil {
/**
* 大小写可以忽略
* 下划线 _ 被忽略
* NULL值和空字符串不会覆盖新值
*
* @param source
* @param target
* @param <T>
* @return
*/
public static <T> T copyPropertiesIgnoreCase(Object source, Object target) {
Map<String, Field> sourceMap = CacheFieldMap.getFieldMap(source.getClass());
CacheFieldMap.getFieldMap(target.getClass()).values().forEach((it) -> {
Field field = sourceMap.get(it.getName().toLowerCase().replace("_", ""));
if (field != null) {
it.setAccessible(true);
field.setAccessible(true);
try {
//忽略null和空字符串和final修饰的字符串
if(field.get(source)!=null&& StringUtils.isNotBlank(field.get(source).toString()) && !Modifier.isFinal(field.getModifiers()))
it.set(target, field.get(source));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
System.out.println(target.toString());
return (T) target;
}
private static class CacheFieldMap {
private static Map<String, Map<String, Field>> cacheMap = new HashMap<>();
private static Map<String, Field> getFieldMap(Class clazz) {
Map<String, Field> result = cacheMap.get(clazz.getName());
if (result == null) {
synchronized (CacheFieldMap.class) {
if (result == null) {
Map<String, Field> fieldMap = new HashMap<>();
for (Field field : clazz.getDeclaredFields()) {
fieldMap.put(field.getName().toLowerCase().replace("_", ""), field);
}
cacheMap.put(clazz.getName(), fieldMap);
result = cacheMap.get(clazz.getName());
}
}
}
return result;
}
}
}
当两个类的字段基本一样有些字段的大小写不一样,但是业务含义一样。用其他的工具大小写敏感,不会赋值,需要手动get,set,这个工具类可以解决这个问题,是搬运的,改了一点bug。