This commit is contained in:
Looly 2024-07-15 10:08:10 +08:00
parent 0e9a1a700f
commit dc46dfd9e5
7 changed files with 48 additions and 12 deletions

View File

@ -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<S, T> implements Copier<T> {
/**
* 构造
*
* @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<S, T> implements Copier<T> {
this.target = target;
this.copyOptions = ObjUtil.defaultIfNull(copyOptions, CopyOptions::of);
}
/**
* 获取Bean描述信息<br>
* 如果用户自定义了{@link BeanDesc}实现则使用否则使用默认的规则
*
* @param actualEditable 需要解析的类
* @return {@link BeanDesc}
*/
protected BeanDesc getBeanDesc(final Class<?> actualEditable) {
if (null != this.copyOptions) {
final Class<BeanDesc> beanDescClass = copyOptions.beanDescClass;
if (null != beanDescClass) {
return ConstructorUtil.newInstance(beanDescClass, actualEditable);
}
}
return BeanUtil.getBeanDesc(actualEditable);
}
}

View File

@ -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<S, T> extends AbsCopier<S, T> {
"Target class [{}] not assignable to Editable class [{}]", actualEditable.getName(), copyOptions.editable.getName());
actualEditable = copyOptions.editable;
}
final Map<String, PropDesc> targetPropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
final Map<String, PropDesc> targetPropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
final Map<String, PropDesc> sourcePropDescMap = BeanUtil.getBeanDesc(source.getClass()).getPropMap(copyOptions.ignoreCase);
final Map<String, PropDesc> sourcePropDescMap = getBeanDesc(source.getClass()).getPropMap(copyOptions.ignoreCase);
sourcePropDescMap.forEach((sFieldName, sDesc) -> {
if (null == sFieldName || !sDesc.isReadable(copyOptions.transientSupport)) {
// 字段空或不可读跳过

View File

@ -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<Object, Map> {
actualEditable = copyOptions.editable;
}
final Map<String, PropDesc> sourcePropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
final Map<String, PropDesc> sourcePropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
sourcePropDescMap.forEach((sFieldName, sDesc) -> {
if (null == sFieldName || !sDesc.isReadable(copyOptions.transientSupport)) {
// 字段空或不可读跳过

View File

@ -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解析类<br>
* 默认规则下普通Bean使用严格的Bean解析需要同时解析Bean中的字段和方法然后匹配自定义后可以只解析getter和setter方法
*/
protected Class<BeanDesc> beanDescClass;
/**
* 自定义类型转换器默认使用全局万能转换器转换
*/

View File

@ -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<T> extends AbsCopier<Map<?, ?>, T> {
"Target class [{}] not assignable to Editable class [{}]", actualEditable.getName(), copyOptions.editable.getName());
actualEditable = copyOptions.editable;
}
final Map<String, PropDesc> targetPropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
final Map<String, PropDesc> targetPropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
this.source.forEach((sKey, sValue) -> {
if (null == sKey) {

View File

@ -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<T> extends AbsCopier<ValueProvider<String
"Target class [{}] not assignable to Editable class [{}]", actualEditable.getName(), copyOptions.editable.getName());
actualEditable = copyOptions.editable;
}
final Map<String, PropDesc> targetPropDescMap = BeanUtil.getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
final Map<String, PropDesc> targetPropDescMap = getBeanDesc(actualEditable).getPropMap(copyOptions.ignoreCase);
targetPropDescMap.forEach((tFieldName, tDesc) -> {
if (null == tFieldName) {

View File

@ -36,8 +36,21 @@ public class BeanValueProvider implements ValueProvider<String> {
* @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