diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java index 95d9bb324..1de2c566e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java @@ -1,39 +1,69 @@ package cn.hutool.core.bean; +import cn.hutool.core.lang.SimpleCache; +import cn.hutool.core.lang.func.Func0; + import java.beans.PropertyDescriptor; import java.util.Map; -import cn.hutool.core.lang.SimpleCache; - /** * Bean属性缓存
* 缓存用于防止多次反射造成的性能问题 - * @author Looly * + * @author Looly */ public enum BeanInfoCache { INSTANCE; - + private final SimpleCache, Map> pdCache = new SimpleCache<>(); private final SimpleCache, Map> ignoreCasePdCache = new SimpleCache<>(); - + /** * 获得属性名和{@link PropertyDescriptor}Map映射 - * @param beanClass Bean的类 + * + * @param beanClass Bean的类 * @param ignoreCase 是否忽略大小写 * @return 属性名和{@link PropertyDescriptor}Map映射 */ - public Map getPropertyDescriptorMap(Class beanClass, boolean ignoreCase){ - return (ignoreCase ? ignoreCasePdCache : pdCache).get(beanClass); + public Map getPropertyDescriptorMap(Class beanClass, boolean ignoreCase) { + return getCache(ignoreCase).get(beanClass); } - + + /** + * 获得属性名和{@link PropertyDescriptor}Map映射 + * + * @param beanClass Bean的类 + * @param ignoreCase 是否忽略大小写 + * @param supplier 缓存对象产生函数 + * @return 属性名和{@link PropertyDescriptor}Map映射 + * @since 5.4.1 + */ + public Map getPropertyDescriptorMap( + Class beanClass, + boolean ignoreCase, + Func0> supplier) { + return getCache(ignoreCase).get(beanClass, supplier); + } + /** * 加入缓存 - * @param beanClass Bean的类 + * + * @param beanClass Bean的类 * @param fieldNamePropertyDescriptorMap 属性名和{@link PropertyDescriptor}Map映射 - * @param ignoreCase 是否忽略大小写 + * @param ignoreCase 是否忽略大小写 */ - public void putPropertyDescriptorMap(Class beanClass, Map fieldNamePropertyDescriptorMap, boolean ignoreCase){ - (ignoreCase ? ignoreCasePdCache : pdCache).put(beanClass, fieldNamePropertyDescriptorMap); + public void putPropertyDescriptorMap(Class beanClass, Map fieldNamePropertyDescriptorMap, boolean ignoreCase) { + getCache(ignoreCase).put(beanClass, fieldNamePropertyDescriptorMap); + } + + /** + * 根据是否忽略字段名的大小写,返回不用Cache对象 + * + * @param ignoreCase 是否忽略大小写 + * @return SimpleCache + * @since 5.4.1 + */ + private SimpleCache, Map> getCache(boolean ignoreCase) { + return ignoreCase ? ignoreCasePdCache : pdCache; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 5b71af0e2..4aa6f8047 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -205,12 +205,7 @@ public class BeanUtil { * @throws BeanException 获取属性异常 */ public static Map getPropertyDescriptorMap(Class clazz, boolean ignoreCase) throws BeanException { - Map map = BeanInfoCache.INSTANCE.getPropertyDescriptorMap(clazz, ignoreCase); - if (null == map) { - map = internalGetPropertyDescriptorMap(clazz, ignoreCase); - BeanInfoCache.INSTANCE.putPropertyDescriptorMap(clazz, map, ignoreCase); - } - return map; + return BeanInfoCache.INSTANCE.getPropertyDescriptorMap(clazz, ignoreCase, ()-> internalGetPropertyDescriptorMap(clazz, ignoreCase)); } /**