diff --git a/CHANGELOG.md b/CHANGELOG.md index 66f613e63..84418d6f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.17 (2021-11-18) +# 5.7.17 (2021-11-19) ### 🐣新特性 * 【core 】 增加AsyncUtil(pr#457@Gitee) @@ -18,6 +18,7 @@ * 【core 】 Opt增加部分方法(pr#459@Gitee) * 【core 】 增加DefaultCloneable(pr#459@Gitee) * 【core 】 CollStreamUtil增加是否并行的重载(pr#467@Gitee) +* 【core 】 ResourceClassLoader增加缓存(pr#1959@Github) * ### 🐞Bug修复 * 【core 】 修复FileResource构造fileName参数无效问题(issue#1942@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ResourceClassLoader.java b/hutool-core/src/main/java/cn/hutool/core/lang/ResourceClassLoader.java index a55aefc63..383f6b98b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ResourceClassLoader.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ResourceClassLoader.java @@ -7,23 +7,21 @@ import cn.hutool.core.util.ObjectUtil; import java.security.SecureClassLoader; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** * 资源类加载器,可以加载任意类型的资源类 * * @param {@link Resource}接口实现类 - * @author looly,lzpeng + * @author looly, lzpeng * @since 5.5.2 */ public class ResourceClassLoader extends SecureClassLoader { private final Map resourceMap; - /** * 缓存已经加载的类 */ - private final Map cacheClassMap; + private final Map> cacheClassMap; /** * 构造 @@ -34,36 +32,42 @@ public class ResourceClassLoader extends SecureClassLoader { public ResourceClassLoader(ClassLoader parentClassLoader, Map resourceMap) { super(ObjectUtil.defaultIfNull(parentClassLoader, ClassLoaderUtil.getClassLoader())); this.resourceMap = ObjectUtil.defaultIfNull(resourceMap, new HashMap<>()); - this.cacheClassMap = new ConcurrentHashMap<>(); + this.cacheClassMap = new HashMap<>(); } /** * 增加需要加载的类资源 + * * @param resource 资源,可以是文件、流或者字符串 * @return this */ - public ResourceClassLoader addResource(T resource){ + public ResourceClassLoader addResource(T resource) { this.resourceMap.put(resource.getName(), resource); return this; } @Override protected Class findClass(String name) throws ClassNotFoundException { - final Class clazz = cacheClassMap.computeIfAbsent(name, className -> { - final Resource resource = resourceMap.get(name); - if (null != resource) { - final byte[] bytes = resource.readBytes(); - return defineClass(name, bytes, 0, bytes.length); - } - try { - return super.findClass(name); - } catch (ClassNotFoundException e) { - return null; - } - }); + final Class clazz = cacheClassMap.computeIfAbsent(name, this::defineByName); if (clazz == null) { - throw new ClassNotFoundException(name); + return super.findClass(name); } return clazz; } + + /** + * 从给定资源中读取class的二进制流,然后生成类
+ * 如果这个类资源不存在,返回{@code null} + * + * @param name 类名 + * @return 定义的类 + */ + private Class defineByName(String name) { + final Resource resource = resourceMap.get(name); + if (null != resource) { + final byte[] bytes = resource.readBytes(); + return defineClass(name, bytes, 0, bytes.length); + } + return null; + } }