From 514dea21b250aa258eb78157f137d4338aa3d1c1 Mon Sep 17 00:00:00 2001 From: lzpeng723 <1500913306@qq.com> Date: Sat, 6 Nov 2021 09:55:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B1=E4=BA=8E=20FileObjectResource=20?= =?UTF-8?q?=E7=9A=84=E6=B5=81=E4=B8=8D=E8=83=BD=E8=AF=BB=E5=8F=96=E5=A4=9A?= =?UTF-8?q?=E6=AC=A1=EF=BC=8CResourceClassLoader=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BC=93=E5=AD=98,=E5=90=8C=E4=B8=80=E4=B8=AA=E7=B1=BB?= =?UTF-8?q?=E5=8F=AA=E8=83=BD=E5=8A=A0=E8=BD=BD=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/lang/ResourceClassLoader.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) 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 c7e11d7b7..a55aefc63 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,18 +7,24 @@ 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 + * @author looly,lzpeng * @since 5.5.2 */ public class ResourceClassLoader extends SecureClassLoader { private final Map resourceMap; + /** + * 缓存已经加载的类 + */ + private final Map cacheClassMap; + /** * 构造 * @@ -28,6 +34,7 @@ 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<>(); } /** @@ -42,11 +49,21 @@ public class ResourceClassLoader extends SecureClassLoader { @Override protected Class findClass(String name) throws ClassNotFoundException { - final Resource resource = resourceMap.get(name); - if (null != resource) { - final byte[] bytes = resource.readBytes(); - return defineClass(name, bytes, 0, bytes.length); + 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; + } + }); + if (clazz == null) { + throw new ClassNotFoundException(name); } - return super.findClass(name); + return clazz; } }