浏览代码

fix beanUtil

Looly 5 年之前
父节点
当前提交
c8f911ad4b

+ 42 - 12
hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java

@@ -1,39 +1,69 @@
 package cn.hutool.core.bean;
 package cn.hutool.core.bean;
 
 
+import cn.hutool.core.lang.SimpleCache;
+import cn.hutool.core.lang.func.Func0;
+
 import java.beans.PropertyDescriptor;
 import java.beans.PropertyDescriptor;
 import java.util.Map;
 import java.util.Map;
 
 
-import cn.hutool.core.lang.SimpleCache;
-
 /**
 /**
  * Bean属性缓存<br>
  * Bean属性缓存<br>
  * 缓存用于防止多次反射造成的性能问题
  * 缓存用于防止多次反射造成的性能问题
- * @author Looly
  *
  *
+ * @author Looly
  */
  */
 public enum BeanInfoCache {
 public enum BeanInfoCache {
 	INSTANCE;
 	INSTANCE;
-	
+
 	private final SimpleCache<Class<?>, Map<String, PropertyDescriptor>> pdCache = new SimpleCache<>();
 	private final SimpleCache<Class<?>, Map<String, PropertyDescriptor>> pdCache = new SimpleCache<>();
 	private final SimpleCache<Class<?>, Map<String, PropertyDescriptor>> ignoreCasePdCache = new SimpleCache<>();
 	private final SimpleCache<Class<?>, Map<String, PropertyDescriptor>> ignoreCasePdCache = new SimpleCache<>();
-	
+
+	/**
+	 * 获得属性名和{@link PropertyDescriptor}Map映射
+	 *
+	 * @param beanClass  Bean的类
+	 * @param ignoreCase 是否忽略大小写
+	 * @return 属性名和{@link PropertyDescriptor}Map映射
+	 */
+	public Map<String, PropertyDescriptor> getPropertyDescriptorMap(Class<?> beanClass, boolean ignoreCase) {
+		return getCache(ignoreCase).get(beanClass);
+	}
+
 	/**
 	/**
 	 * 获得属性名和{@link PropertyDescriptor}Map映射
 	 * 获得属性名和{@link PropertyDescriptor}Map映射
-	 * @param beanClass Bean的类
+	 *
+	 * @param beanClass  Bean的类
 	 * @param ignoreCase 是否忽略大小写
 	 * @param ignoreCase 是否忽略大小写
+	 * @param supplier   缓存对象产生函数
 	 * @return 属性名和{@link PropertyDescriptor}Map映射
 	 * @return 属性名和{@link PropertyDescriptor}Map映射
+	 * @since 5.4.1
 	 */
 	 */
-	public Map<String, PropertyDescriptor> getPropertyDescriptorMap(Class<?> beanClass, boolean ignoreCase){
-		return (ignoreCase ? ignoreCasePdCache : pdCache).get(beanClass);
+	public Map<String, PropertyDescriptor> getPropertyDescriptorMap(
+			Class<?> beanClass,
+			boolean ignoreCase,
+			Func0<Map<String, PropertyDescriptor>> supplier) {
+		return getCache(ignoreCase).get(beanClass, supplier);
 	}
 	}
-	
+
 	/**
 	/**
 	 * 加入缓存
 	 * 加入缓存
-	 * @param beanClass Bean的类
+	 *
+	 * @param beanClass                      Bean的类
 	 * @param fieldNamePropertyDescriptorMap 属性名和{@link PropertyDescriptor}Map映射
 	 * @param fieldNamePropertyDescriptorMap 属性名和{@link PropertyDescriptor}Map映射
+	 * @param ignoreCase                     是否忽略大小写
+	 */
+	public void putPropertyDescriptorMap(Class<?> beanClass, Map<String, PropertyDescriptor> fieldNamePropertyDescriptorMap, boolean ignoreCase) {
+		getCache(ignoreCase).put(beanClass, fieldNamePropertyDescriptorMap);
+	}
+
+	/**
+	 * 根据是否忽略字段名的大小写,返回不用Cache对象
+	 *
 	 * @param ignoreCase 是否忽略大小写
 	 * @param ignoreCase 是否忽略大小写
+	 * @return SimpleCache
+	 * @since 5.4.1
 	 */
 	 */
-	public void putPropertyDescriptorMap(Class<?> beanClass, Map<String, PropertyDescriptor> fieldNamePropertyDescriptorMap, boolean ignoreCase){
-		(ignoreCase ? ignoreCasePdCache : pdCache).put(beanClass, fieldNamePropertyDescriptorMap);
+	private SimpleCache<Class<?>, Map<String, PropertyDescriptor>> getCache(boolean ignoreCase) {
+		return ignoreCase ? ignoreCasePdCache : pdCache;
 	}
 	}
 }
 }

+ 1 - 6
hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java

@@ -205,12 +205,7 @@ public class BeanUtil {
 	 * @throws BeanException 获取属性异常
 	 * @throws BeanException 获取属性异常
 	 */
 	 */
 	public static Map<String, PropertyDescriptor> getPropertyDescriptorMap(Class<?> clazz, boolean ignoreCase) throws BeanException {
 	public static Map<String, PropertyDescriptor> getPropertyDescriptorMap(Class<?> clazz, boolean ignoreCase) throws BeanException {
-		Map<String, PropertyDescriptor> 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));
 	}
 	}
 
 
 	/**
 	/**