diff --git a/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java b/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java index 77de1ab138..3e98304158 100644 --- a/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java +++ b/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java @@ -359,8 +359,8 @@ class ApplicationContextAotGeneratorTests { applicationContext.registerBean(CglibConfiguration.class); TestGenerationContext context = processAheadOfTime(applicationContext); isRegisteredCglibClass(context, CglibConfiguration.class.getName() + "$$SpringCGLIB$$0"); - isRegisteredCglibClass(context, CglibConfiguration.class.getName() + "$$SpringCGLIB$$1"); - isRegisteredCglibClass(context, CglibConfiguration.class.getName() + "$$SpringCGLIB$$2"); + isRegisteredCglibClass(context, CglibConfiguration.class.getName() + "$$SpringCGLIB$$FastClass$$0"); + isRegisteredCglibClass(context, CglibConfiguration.class.getName() + "$$SpringCGLIB$$FastClass$$1"); } private void isRegisteredCglibClass(TestGenerationContext context, String cglibClassName) throws IOException { diff --git a/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java b/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java index ee595070be..347975a0e0 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/SpringNamingPolicy.java @@ -25,6 +25,7 @@ package org.springframework.cglib.core; * in the classpath. * * @author Juergen Hoeller + * @author Sam Brannen * @since 3.2.8 / 6.0 */ public final class SpringNamingPolicy implements NamingPolicy { @@ -33,6 +34,8 @@ public final class SpringNamingPolicy implements NamingPolicy { private static final String SPRING_LABEL = "$$SpringCGLIB$$"; + private static final String FAST_CLASS_SUFFIX = "FastClass$$"; + private SpringNamingPolicy() { } @@ -55,6 +58,13 @@ public final class SpringNamingPolicy implements NamingPolicy { base = prefix + SPRING_LABEL; } + // When the generated class name is for a FastClass, the source is + // "org.springframework.cglib.reflect.FastClass". + boolean isFastClass = (source != null && source.endsWith(".FastClass")); + if (isFastClass && !prefix.contains(FAST_CLASS_SUFFIX)) { + base += FAST_CLASS_SUFFIX; + } + int index = 0; String attempt = base + index; while (names.evaluate(attempt)) { diff --git a/spring-core/src/test/java/org/springframework/cglib/core/SpringNamingPolicyTests.java b/spring-core/src/test/java/org/springframework/cglib/core/SpringNamingPolicyTests.java index 75fd0a89c4..6f3e32e58d 100644 --- a/spring-core/src/test/java/org/springframework/cglib/core/SpringNamingPolicyTests.java +++ b/spring-core/src/test/java/org/springframework/cglib/core/SpringNamingPolicyTests.java @@ -21,6 +21,8 @@ import java.util.Set; import org.junit.jupiter.api.Test; +import org.springframework.cglib.reflect.FastClass; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -67,6 +69,15 @@ class SpringNamingPolicyTests { assertThat(getClassName(generated1)).isEqualTo(generated2); } + @Test + void fastClass() { + String prefix = "example.MyComponent"; + String source = FastClass.class.getName(); + assertThat(getClassName(prefix, "a.b.c", null)).isEqualTo("example.MyComponent$$SpringCGLIB$$0"); + assertThat(getClassName(prefix, source, null)).isEqualTo("example.MyComponent$$SpringCGLIB$$FastClass$$0"); + assertThat(getClassName(prefix, source, null)).isEqualTo("example.MyComponent$$SpringCGLIB$$FastClass$$1"); + } + private String getClassName(String prefix) { return getClassName(prefix, null, null); }