ConfigurationClassParser falls back to ASM-based resolution of member classes in case of NoClassDefFoundError

Issue: SPR-11844
master
Juergen Hoeller 10 years ago
parent bb8d0f1740
commit 6aa9c40552
  1. 30
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

@ -537,6 +537,7 @@ class ConfigurationClassParser {
return new SourceClass(classType); return new SourceClass(classType);
} }
catch (Throwable ex) { catch (Throwable ex) {
// Enforce ASM via class name resolution
return asSourceClass(classType.getName()); return asSourceClass(classType.getName());
} }
} }
@ -693,10 +694,14 @@ class ConfigurationClassParser {
} }
public Collection<SourceClass> getMemberClasses() throws IOException { public Collection<SourceClass> getMemberClasses() throws IOException {
List<SourceClass> members = new ArrayList<SourceClass>(); Object sourceToProcess = this.source;
if (this.source instanceof Class<?>) {
Class<?> sourceClass = (Class<?>) this.source; if (sourceToProcess instanceof Class<?>) {
for (Class<?> declaredClass : sourceClass.getDeclaredClasses()) { Class<?> sourceClass = (Class<?>) sourceToProcess;
try {
Class<?>[] declaredClasses = sourceClass.getDeclaredClasses();
List<SourceClass> members = new ArrayList<SourceClass>(declaredClasses.length);
for (Class<?> declaredClass : declaredClasses) {
try { try {
members.add(asSourceClass(declaredClass)); members.add(asSourceClass(declaredClass));
} }
@ -704,10 +709,20 @@ class ConfigurationClassParser {
// ignore // ignore
} }
} }
return members;
} }
else { catch (NoClassDefFoundError err) {
MetadataReader sourceReader = (MetadataReader) source; // getDeclaredClasses() failed because of non-resolvable dependencies
for (String memberClassName : sourceReader.getClassMetadata().getMemberClassNames()) { // -> fall back to ASM below
sourceToProcess = metadataReaderFactory.getMetadataReader(sourceClass.getName());
}
}
// ASM-based resolution - safe for non-resolvable classes as well
MetadataReader sourceReader = (MetadataReader) sourceToProcess;
String[] memberClassNames = sourceReader.getClassMetadata().getMemberClassNames();
List<SourceClass> members = new ArrayList<SourceClass>(memberClassNames.length);
for (String memberClassName : memberClassNames) {
try { try {
members.add(asSourceClass(memberClassName)); members.add(asSourceClass(memberClassName));
} }
@ -715,7 +730,6 @@ class ConfigurationClassParser {
// ignore // ignore
} }
} }
}
return members; return members;
} }

Loading…
Cancel
Save