不多说,直接上代码
import lombok.experimental.Accessors;
import org.springframework.cglib.beans.BeanCopier;
import java.io.Serializable;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author:Lee
* @date: 2020/2/19
* @description:注意,当复制和被复制任意一个对象包含了@Accessors(chain = true)注解不能使用该copy,可以使用spring的BeanUtils.copy
*/
public class BeanUtils {
private static ConcurrentHashMap<BeanCopierKey, BeanCopier> map = new ConcurrentHashMap<BeanCopierKey, BeanCopier>();
public static <T extends Serializable> T copy(Object obj, Class<T> targetClazz) {
T t = null;
if (obj == null || targetClazz == null) {
return t;
}
Class<?> srcType = obj.getClass();
BeanCopierKey key = new BeanCopierKey(srcType, targetClazz);
BeanCopier copier = map.get(key);
if (copier == null) {
map.putIfAbsent(key, BeanCopier.create(srcType, targetClazz, false));
copier = map.get(key);
}
try {
t = targetClazz.newInstance();
copier.copy(obj, t, null);
}
catch (Exception e) {
System.out.println("Bean对象复制失败: " + key);
}
return t;
}
static class BeanCopierKey {
Class<?> srcType;
Class<?> targetType;
public BeanCopierKey(Class<?> srcType, Class<?> targetType) {
this.srcType = srcType;
this.targetType = targetType;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof BeanCopierKey)) {
return false;
}
BeanCopierKey key = (BeanCopierKey)obj;
return key.srcType == srcType && key.targetType == targetType;
}
@Override
public int hashCode() {
return srcType.hashCode() + targetType.hashCode();
}
@Override
public String toString() {
return srcType + " -> " + targetType;
}
}
}