Skip to content

Commit 178d58c

Browse files
committed
ConfigurationClassParser falls back to ASM-based resolution of member classes in case of NoClassDefFoundError
Issue: SPR-11844 (cherry picked from commit 6aa9c40)
1 parent 7b38b41 commit 178d58c

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

+32-18
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ public SourceClass asSourceClass(Class<?> classType) throws IOException, ClassNo
537537
return new SourceClass(classType);
538538
}
539539
catch (Throwable ex) {
540+
// Enforce ASM via class name resolution
540541
return asSourceClass(classType.getName());
541542
}
542543
}
@@ -693,27 +694,40 @@ public ConfigurationClass asConfigClass(ConfigurationClass importedBy) throws IO
693694
}
694695

695696
public Collection<SourceClass> getMemberClasses() throws IOException {
696-
List<SourceClass> members = new ArrayList<SourceClass>();
697-
if (this.source instanceof Class<?>) {
698-
Class<?> sourceClass = (Class<?>) this.source;
699-
for (Class<?> declaredClass : sourceClass.getDeclaredClasses()) {
700-
try {
701-
members.add(asSourceClass(declaredClass));
702-
}
703-
catch (ClassNotFoundException ex) {
704-
// ignore
697+
Object sourceToProcess = this.source;
698+
699+
if (sourceToProcess instanceof Class<?>) {
700+
Class<?> sourceClass = (Class<?>) sourceToProcess;
701+
try {
702+
Class<?>[] declaredClasses = sourceClass.getDeclaredClasses();
703+
List<SourceClass> members = new ArrayList<SourceClass>(declaredClasses.length);
704+
for (Class<?> declaredClass : declaredClasses) {
705+
try {
706+
members.add(asSourceClass(declaredClass));
707+
}
708+
catch (ClassNotFoundException ex) {
709+
// ignore
710+
}
705711
}
712+
return members;
713+
}
714+
catch (NoClassDefFoundError err) {
715+
// getDeclaredClasses() failed because of non-resolvable dependencies
716+
// -> fall back to ASM below
717+
sourceToProcess = metadataReaderFactory.getMetadataReader(sourceClass.getName());
706718
}
707719
}
708-
else {
709-
MetadataReader sourceReader = (MetadataReader) source;
710-
for (String memberClassName : sourceReader.getClassMetadata().getMemberClassNames()) {
711-
try {
712-
members.add(asSourceClass(memberClassName));
713-
}
714-
catch (ClassNotFoundException ex) {
715-
// ignore
716-
}
720+
721+
// ASM-based resolution - safe for non-resolvable classes as well
722+
MetadataReader sourceReader = (MetadataReader) sourceToProcess;
723+
String[] memberClassNames = sourceReader.getClassMetadata().getMemberClassNames();
724+
List<SourceClass> members = new ArrayList<SourceClass>(memberClassNames.length);
725+
for (String memberClassName : memberClassNames) {
726+
try {
727+
members.add(asSourceClass(memberClassName));
728+
}
729+
catch (ClassNotFoundException ex) {
730+
// ignore
717731
}
718732
}
719733
return members;

0 commit comments

Comments
 (0)