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; } }