diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java index 8ec09389f..0c1d6ef87 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java @@ -8,7 +8,6 @@ import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.LambdaUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; import java.io.Serializable; import java.lang.reflect.Field; @@ -83,10 +82,8 @@ public class CopyOptions implements Serializable { return null; } - final String name = value.getClass().getName(); - if(ArrayUtil.contains(new String[]{"cn.hutool.json.JSONObject", "cn.hutool.json.JSONArray"}, name)){ - // 由于设计缺陷导致JSON转Bean时无法使用自定义的反序列化器,此处采用反射方式修复bug,此类问题会在6.x解决 - return ReflectUtil.invoke(value, "toBean", ObjectUtil.defaultIfNull(type, Object.class)); + if(value instanceof IJSONTypeConverter) { + return ((IJSONTypeConverter)value).toBean(ObjectUtil.defaultIfNull(type, Object.class)); } return Convert.convertWithCheck(type, value, null, ignoreError); diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java new file mode 100644 index 000000000..628231f28 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java @@ -0,0 +1,23 @@ +package cn.hutool.core.bean.copier; + +import java.lang.reflect.Type; + +/** + * JSON自定义转换扩展接口,因core模块无法直接调用json模块而创建, + * 使用此接口避免使用反射调用toBean方法而性能太差。 + * + * @author mkeq + */ +public interface IJSONTypeConverter { + + /** + * 转为实体类对象 + * + * @param Bean类型 + * @param type {@link Type} + * @return 实体类对象 + * @since 3.0.8 + */ + T toBean(Type type); + +} diff --git a/hutool-json/src/main/java/cn/hutool/json/JSON.java b/hutool-json/src/main/java/cn/hutool/json/JSON.java index 2af783ccd..84eb35c5e 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSON.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSON.java @@ -1,6 +1,7 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanPath; +import cn.hutool.core.bean.copier.IJSONTypeConverter; import cn.hutool.core.lang.TypeReference; import java.io.Serializable; @@ -13,7 +14,7 @@ import java.lang.reflect.Type; * * @author Looly */ -public interface JSON extends Cloneable, Serializable { +public interface JSON extends Cloneable, Serializable, IJSONTypeConverter { /** * 获取JSON配置 @@ -177,7 +178,7 @@ public interface JSON extends Cloneable, Serializable { * @since 3.0.8 */ default T toBean(Type type) { - return JSONConverter.jsonConvert(type, this, getConfig()); + return toBean(type, getConfig().isIgnoreError()); } /**