diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 8c99d1c385..ef78235db6 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -537,6 +537,7 @@ class ConfigurationClassParser { return new SourceClass(classType); } catch (Throwable ex) { + // Enforce ASM via class name resolution return asSourceClass(classType.getName()); } } @@ -693,27 +694,40 @@ class ConfigurationClassParser { } public Collection getMemberClasses() throws IOException { - List members = new ArrayList(); - if (this.source instanceof Class) { - Class sourceClass = (Class) this.source; - for (Class declaredClass : sourceClass.getDeclaredClasses()) { - try { - members.add(asSourceClass(declaredClass)); - } - catch (ClassNotFoundException ex) { - // ignore + Object sourceToProcess = this.source; + + if (sourceToProcess instanceof Class) { + Class sourceClass = (Class) sourceToProcess; + try { + Class[] declaredClasses = sourceClass.getDeclaredClasses(); + List members = new ArrayList(declaredClasses.length); + for (Class declaredClass : declaredClasses) { + try { + members.add(asSourceClass(declaredClass)); + } + catch (ClassNotFoundException ex) { + // ignore + } } + return members; + } + catch (NoClassDefFoundError err) { + // getDeclaredClasses() failed because of non-resolvable dependencies + // -> fall back to ASM below + sourceToProcess = metadataReaderFactory.getMetadataReader(sourceClass.getName()); } } - else { - MetadataReader sourceReader = (MetadataReader) source; - for (String memberClassName : sourceReader.getClassMetadata().getMemberClassNames()) { - try { - members.add(asSourceClass(memberClassName)); - } - catch (ClassNotFoundException ex) { - // ignore - } + + // ASM-based resolution - safe for non-resolvable classes as well + MetadataReader sourceReader = (MetadataReader) sourceToProcess; + String[] memberClassNames = sourceReader.getClassMetadata().getMemberClassNames(); + List members = new ArrayList(memberClassNames.length); + for (String memberClassName : memberClassNames) { + try { + members.add(asSourceClass(memberClassName)); + } + catch (ClassNotFoundException ex) { + // ignore } } return members;