Skip to content

Commit 13b09e6

Browse files
philwebbbclozel
authored andcommitted
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
1 parent ead80ce commit 13b09e6

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

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

+8-10
Original file line numberDiff line numberDiff line change
@@ -268,18 +268,16 @@ void interfaces(Interfaces interfaces) {
268268
void nestMembers(String currentClassName, InnerClassesAttribute innerClasses) {
269269
for (InnerClassInfo classInfo : innerClasses.classes()) {
270270
String innerClassName = classInfo.innerClass().name().stringValue();
271-
// skip parent inner classes
272-
if (!innerClassName.startsWith(currentClassName)) {
273-
continue;
274-
}
275-
// the current class is an inner class
276-
else if (currentClassName.equals(innerClassName)) {
271+
if (currentClassName.equals(innerClassName)) {
272+
// the current class is an inner class
277273
this.innerAccessFlags = classInfo.flags();
278274
}
279-
// collecting data about actual inner classes
280-
else {
281-
this.memberClassNames.add(ClassUtils.convertResourcePathToClassName(innerClassName));
282-
}
275+
classInfo.outerClass().ifPresent(outerClass -> {
276+
if (outerClass.name().stringValue().equals(currentClassName)) {
277+
// collecting data about actual inner classes
278+
this.memberClassNames.add(ClassUtils.convertResourcePathToClassName(innerClassName));
279+
}
280+
});
283281
}
284282
}
285283

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

+23
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ void getMemberClassNamesWhenHasMemberClassesReturnsNames() {
184184
TestMemberClass.TestMemberClassInnerClass.class.getName(), TestMemberClass.TestMemberClassInnerInterface.class.getName());
185185
}
186186

187+
@Test
188+
void getMemberClassNamesWhenHasNestedMemberClassesReturnsOnlyFirstLevel() {
189+
assertThat(get(TestNestedMemberClass.class).getMemberClassNames()).containsOnly(
190+
TestNestedMemberClass.TestMemberClassInnerClassA.class.getName(),
191+
TestNestedMemberClass.TestMemberClassInnerClassB.class.getName());
192+
}
193+
187194
@Test
188195
void getMemberClassNamesWhenHasNoMemberClassesReturnsEmptyArray() {
189196
assertThat(get(TestClass.class).getMemberClassNames()).isEmpty();
@@ -220,6 +227,22 @@ interface TestMemberClassInnerInterface {
220227

221228
}
222229

230+
public static class TestNestedMemberClass {
231+
232+
public static class TestMemberClassInnerClassA {
233+
234+
public static class TestMemberClassInnerClassAA {
235+
236+
}
237+
238+
}
239+
240+
public static class TestMemberClassInnerClassB {
241+
242+
}
243+
244+
}
245+
223246
}
224247

225248
@Nested

0 commit comments

Comments
 (0)