Commit f0741e83 authored by liaozan's avatar liaozan 🏀

Remove BeanCopyUtils convert logic

parent 857174d8
package com.schbrain.common.util; package com.schbrain.common.util;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.convert.ConverterRegistry;
import cn.hutool.core.lang.Singleton; import cn.hutool.core.lang.Singleton;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
import org.springframework.util.ClassUtils;
import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* 注意!!!此类是基于 cglib 实现的
* <p> * <p>
* 默认的 cglib 只支持同名,同类型的属性转换,本类对此场景进行了增强,具体逻辑见 {@link DefaultConverter} * FBI Warning!!!此类是基于 cglib 实现的, cglib 只支持同名,同类型的属性转换
* <p> * <p>
* 另外最重要的, cglib 是浅拷贝,意味着如果是引用类型,修改源对象会导致目标对象的值也被修改,使用时请注意!!! * 另外 cglib 是浅拷贝,意味着如果是引用类型,修改源对象会导致目标对象的值也被修改,使用时请注意!!!
* *
* @author liaozan * @author liaozan
* @since 2022/1/24 * @since 2022/1/24
...@@ -58,39 +52,17 @@ public class BeanCopyUtils { ...@@ -58,39 +52,17 @@ public class BeanCopyUtils {
return null; return null;
} }
BeanCopier copier = getCopier(source.getClass(), target.getClass()); BeanCopier copier = getCopier(source.getClass(), target.getClass());
copier.copy(source, target, DefaultConverter.INSTANCE); copier.copy(source, target, null);
return target; return target;
} }
private static BeanCopier getCopier(Class<?> sourceClass, Class<?> targetClass) { private static BeanCopier getCopier(Class<?> sourceClass, Class<?> targetClass) {
String cacheKey = buildCacheKey(sourceClass, targetClass); String cacheKey = buildCacheKey(sourceClass, targetClass);
return Singleton.get(cacheKey, () -> BeanCopier.create(sourceClass, targetClass, true)); return Singleton.get(cacheKey, () -> BeanCopier.create(sourceClass, targetClass, false));
} }
private static String buildCacheKey(Class<?> source, Class<?> target) { private static String buildCacheKey(Class<?> source, Class<?> target) {
return CACHE_KEY_JOINER.join(source.getName(), target.getName()); return CACHE_KEY_JOINER.join(source.getName(), target.getName());
} }
/**
* 基于 hutool 实现的转换
*
* @see ConverterRegistry#getConverter(Type, boolean)
*/
private static class DefaultConverter implements Converter {
private static final DefaultConverter INSTANCE = new DefaultConverter();
@Override
public Object convert(Object value, Class targetType, Object context) {
if (value == null) {
return null;
}
if (ClassUtils.isAssignableValue(targetType, value)) {
return value;
}
return Convert.convertQuietly(targetType, value);
}
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment