From b4c6c554935a28d3734b9c053e381bc113d15c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 10 Apr 2025 16:22:14 +0200 Subject: [PATCH] Allow ResourcesClassLoader to participate in CGLIB's cache This commit updates ResourcesClassLoader to be a SmartClassLoader and expose the original ClassLoader. This has the effect of making sure proxies that are created by CGLIB can be reused against different tests rather than having CGLIB trying to define the class again and fail. Closes gh-45065 --- .../classpath/resources/ResourcesClassLoader.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java index 2eeef880c1..eab1f7ad65 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/classpath/resources/ResourcesClassLoader.java @@ -19,16 +19,19 @@ package org.springframework.boot.testsupport.classpath.resources; import java.io.IOException; import java.io.UncheckedIOException; import java.net.URL; +import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; +import org.springframework.core.SmartClassLoader; + /** * A {@link ClassLoader} that provides access to {@link Resources resources}. * * @author Andy Wilkinson */ -class ResourcesClassLoader extends ClassLoader { +class ResourcesClassLoader extends ClassLoader implements SmartClassLoader { private final Resources resources; @@ -66,4 +69,14 @@ class ResourcesClassLoader extends ClassLoader { return Collections.enumeration(urls); } + @Override + public ClassLoader getOriginalClassLoader() { + return getParent(); + } + + @Override + public Class publicDefineClass(String name, byte[] b, ProtectionDomain protectionDomain) { + return defineClass(name, b, 0, b.length, protectionDomain); + } + }