diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/AbsCopier.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/AbsCopier.java index cb122c41b..d47722564 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/AbsCopier.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/AbsCopier.java @@ -12,7 +12,10 @@ package org.dromara.hutool.core.bean.copier; +import org.dromara.hutool.core.bean.BeanDesc; +import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.lang.copier.Copier; +import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.util.ObjUtil; /** @@ -35,8 +38,8 @@ public abstract class AbsCopier implements Copier { /** * 构造 * - * @param source 源对象 - * @param target 目标对象 + * @param source 源对象 + * @param target 目标对象 * @param copyOptions 拷贝选项 */ public AbsCopier(final S source, final T target, final CopyOptions copyOptions) { @@ -44,4 +47,21 @@ public abstract class AbsCopier implements Copier { this.target = target; this.copyOptions = ObjUtil.defaultIfNull(copyOptions, CopyOptions::of); } + + /** + * 获取Bean描述信息
+ * 如果用户自定义了{@link BeanDesc}实现,则使用,否则使用默认的规则 + * + * @param actualEditable 需要解析的类 + * @return {@link BeanDesc} + */ + protected BeanDesc getBeanDesc(final Class actualEditable) { + if (null != this.copyOptions) { + final Class beanDescClass = copyOptions.beanDescClass; + if (null != beanDescClass) { + return ConstructorUtil.newInstance(beanDescClass, actualEditable); + } + } + return BeanUtil.getBeanDesc(actualEditable); + } } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToBeanCopier.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToBeanCopier.java index 1b703f4fb..00545177e 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToBeanCopier.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToBeanCopier.java @@ -12,7 +12,6 @@ package org.dromara.hutool.core.bean.copier; -import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.bean.PropDesc; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.mutable.MutableEntry; @@ -58,9 +57,9 @@ public class BeanToBeanCopier extends AbsCopier { "Target class [{}] not assignable to Editable class [{}]", actualEditable.getName(), copyOptions.editable.getName()); actualEditable = copyOptions.editable; } - final Map targetPropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); + final Map targetPropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); - final Map sourcePropDescMap = BeanUtil.getBeanDesc(source.getClass()).getPropMap(copyOptions.ignoreCase); + final Map sourcePropDescMap = getBeanDesc(source.getClass()).getPropMap(copyOptions.ignoreCase); sourcePropDescMap.forEach((sFieldName, sDesc) -> { if (null == sFieldName || !sDesc.isReadable(copyOptions.transientSupport)) { // 字段空或不可读,跳过 diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToMapCopier.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToMapCopier.java index 3fcb6e059..8cb0a54ce 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToMapCopier.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/BeanToMapCopier.java @@ -12,7 +12,6 @@ package org.dromara.hutool.core.bean.copier; -import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.bean.PropDesc; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.mutable.MutableEntry; @@ -59,7 +58,7 @@ public class BeanToMapCopier extends AbsCopier { actualEditable = copyOptions.editable; } - final Map sourcePropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); + final Map sourcePropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); sourcePropDescMap.forEach((sFieldName, sDesc) -> { if (null == sFieldName || !sDesc.isReadable(copyOptions.transientSupport)) { // 字段空或不可读,跳过 diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/CopyOptions.java index d055bc020..482088eaa 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/CopyOptions.java @@ -12,6 +12,7 @@ package org.dromara.hutool.core.bean.copier; +import org.dromara.hutool.core.bean.BeanDesc; import org.dromara.hutool.core.bean.PropDesc; import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.convert.Converter; @@ -90,6 +91,12 @@ public class CopyOptions implements Serializable { */ protected boolean autoTransCamelCase = true; + /** + * 自定义的Bean解析类
+ * 默认规则下普通Bean使用严格的Bean解析,需要同时解析Bean中的字段和方法,然后匹配,自定义后可以只解析getter和setter方法 + */ + protected Class beanDescClass; + /** * 自定义类型转换器,默认使用全局万能转换器转换 */ diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/MapToBeanCopier.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/MapToBeanCopier.java index 2174c3eb8..b8a4de2bb 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/MapToBeanCopier.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/MapToBeanCopier.java @@ -12,7 +12,6 @@ package org.dromara.hutool.core.bean.copier; -import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.bean.PropDesc; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.mutable.MutableEntry; @@ -67,7 +66,7 @@ public class MapToBeanCopier extends AbsCopier, T> { "Target class [{}] not assignable to Editable class [{}]", actualEditable.getName(), copyOptions.editable.getName()); actualEditable = copyOptions.editable; } - final Map targetPropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); + final Map targetPropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); this.source.forEach((sKey, sValue) -> { if (null == sKey) { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProviderToBeanCopier.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProviderToBeanCopier.java index 96b031a1a..c813dadc5 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProviderToBeanCopier.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProviderToBeanCopier.java @@ -12,7 +12,6 @@ package org.dromara.hutool.core.bean.copier; -import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.bean.PropDesc; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.mutable.MutableEntry; @@ -57,7 +56,7 @@ public class ValueProviderToBeanCopier extends AbsCopier targetPropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); + final Map targetPropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase); targetPropDescMap.forEach((tFieldName, tDesc) -> { if (null == tFieldName) { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/provider/BeanValueProvider.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/provider/BeanValueProvider.java index 980f83eaa..a0da726ca 100755 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/provider/BeanValueProvider.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/provider/BeanValueProvider.java @@ -36,8 +36,21 @@ public class BeanValueProvider implements ValueProvider { * @param bean Bean */ public BeanValueProvider(final Object bean) { + this(bean, BeanUtil.getBeanDesc(bean.getClass())); + } + + /** + * 构造 + * + * @param bean Bean + * @param beanDesc 自定义的{@link BeanDesc},默认为{@link BeanUtil#getBeanDesc(Class)} + */ + public BeanValueProvider(final Object bean, BeanDesc beanDesc) { this.bean = bean; - this.beanDesc = BeanUtil.getBeanDesc(bean.getClass()); + if(null == beanDesc){ + beanDesc = BeanUtil.getBeanDesc(bean.getClass()); + } + this.beanDesc = beanDesc; } @Override