Browse Source

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

Issue: SPR-11844
pull/547/merge
Juergen Hoeller 12 years ago
parent
commit
6aa9c40552
  1. 50
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java

50
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,27 +694,40 @@ 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 { try {
members.add(asSourceClass(declaredClass)); Class<?>[] declaredClasses = sourceClass.getDeclaredClasses();
} List<SourceClass> members = new ArrayList<SourceClass>(declaredClasses.length);
catch (ClassNotFoundException ex) { for (Class<?> declaredClass : declaredClasses) {
// ignore 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; // ASM-based resolution - safe for non-resolvable classes as well
for (String memberClassName : sourceReader.getClassMetadata().getMemberClassNames()) { MetadataReader sourceReader = (MetadataReader) sourceToProcess;
try { String[] memberClassNames = sourceReader.getClassMetadata().getMemberClassNames();
members.add(asSourceClass(memberClassName)); List<SourceClass> members = new ArrayList<SourceClass>(memberClassNames.length);
} for (String memberClassName : memberClassNames) {
catch (ClassNotFoundException ex) { try {
// ignore members.add(asSourceClass(memberClassName));
} }
catch (ClassNotFoundException ex) {
// ignore
} }
} }
return members; return members;

Loading…
Cancel
Save