Browse Source

Ensure only immediate member classes are only included

Update `ClassFileClassMetadata` so that member classes only include
immediate children. This aligns with the other `ClassMetadata`
implementations.

Closes gh-34869
pull/34876/head
Phillip Webb 11 months ago committed by Brian Clozel
parent
commit
13b09e6f3c
  1. 18
      spring-core/src/main/java24/org/springframework/core/type/classreading/ClassFileClassMetadata.java
  2. 23
      spring-core/src/test/java/org/springframework/core/type/AbstractAnnotationMetadataTests.java

18
spring-core/src/main/java24/org/springframework/core/type/classreading/ClassFileClassMetadata.java

@ -268,18 +268,16 @@ class ClassFileClassMetadata implements AnnotationMetadata { @@ -268,18 +268,16 @@ class ClassFileClassMetadata implements AnnotationMetadata {
void nestMembers(String currentClassName, InnerClassesAttribute innerClasses) {
for (InnerClassInfo classInfo : innerClasses.classes()) {
String innerClassName = classInfo.innerClass().name().stringValue();
// skip parent inner classes
if (!innerClassName.startsWith(currentClassName)) {
continue;
}
// the current class is an inner class
else if (currentClassName.equals(innerClassName)) {
if (currentClassName.equals(innerClassName)) {
// the current class is an inner class
this.innerAccessFlags = classInfo.flags();
}
// collecting data about actual inner classes
else {
this.memberClassNames.add(ClassUtils.convertResourcePathToClassName(innerClassName));
}
classInfo.outerClass().ifPresent(outerClass -> {
if (outerClass.name().stringValue().equals(currentClassName)) {
// collecting data about actual inner classes
this.memberClassNames.add(ClassUtils.convertResourcePathToClassName(innerClassName));
}
});
}
}

23
spring-core/src/test/java/org/springframework/core/type/AbstractAnnotationMetadataTests.java

@ -184,6 +184,13 @@ public abstract class AbstractAnnotationMetadataTests { @@ -184,6 +184,13 @@ public abstract class AbstractAnnotationMetadataTests {
TestMemberClass.TestMemberClassInnerClass.class.getName(), TestMemberClass.TestMemberClassInnerInterface.class.getName());
}
@Test
void getMemberClassNamesWhenHasNestedMemberClassesReturnsOnlyFirstLevel() {
assertThat(get(TestNestedMemberClass.class).getMemberClassNames()).containsOnly(
TestNestedMemberClass.TestMemberClassInnerClassA.class.getName(),
TestNestedMemberClass.TestMemberClassInnerClassB.class.getName());
}
@Test
void getMemberClassNamesWhenHasNoMemberClassesReturnsEmptyArray() {
assertThat(get(TestClass.class).getMemberClassNames()).isEmpty();
@ -220,6 +227,22 @@ public abstract class AbstractAnnotationMetadataTests { @@ -220,6 +227,22 @@ public abstract class AbstractAnnotationMetadataTests {
}
public static class TestNestedMemberClass {
public static class TestMemberClassInnerClassA {
public static class TestMemberClassInnerClassAA {
}
}
public static class TestMemberClassInnerClassB {
}
}
}
@Nested

Loading…
Cancel
Save