spring的metadata
spring的元数据都继承注解元数据接口AnnotatedTypeMetadata ,因为方法,类和注解里可能都包含注解,所以都要获取注解信息;
除了获取注解信息外,各类型元注解都加了各自本身的信息;如类添加了类名称,获取父类,实现的接口等;
public interface AnnotatedTypeMetadata {
boolean isAnnotated(String var1);
@Nullable
Map<String, Object> getAnnotationAttributes(String var1);
@Nullable
Map<String, Object> getAnnotationAttributes(String var1, boolean var2);
@Nullable
MultiValueMap<String, Object> getAllAnnotationAttributes(String var1);
@Nullable
MultiValueMap<String, Object> getAllAnnotationAttributes(String var1, boolean var2);
}
ClassMetadata 描述的是class类的基本信息,包括类名称,是否接口,获取父类,实现的接口等
public interface ClassMetadata {
String getClassName();
boolean isInterface();
boolean isAnnotation();
boolean isAbstract();
boolean isConcrete();
boolean isFinal();
boolean isIndependent();
boolean hasEnclosingClass();
@Nullable
String getEnclosingClassName();
boolean hasSuperClass();
@Nullable
String getSuperClassName();
String[] getInterfaceNames();
String[] getMemberClassNames();
}
AnnotationMetadata描述的是注解信息,因为注解也是类,所以继承了ClassMetadata,所以他可以获取所有注解类型,是否含有某个注解等,获取注解里的所有属性和类的信息等
public interface AnnotationMetadata extends ClassMetadata, AnnotatedTypeMetadata {
Set<String> getAnnotationTypes();
Set<String> getMetaAnnotationTypes(String var1);
boolean hasAnnotation(String var1);
boolean hasMetaAnnotation(String var1);
boolean hasAnnotatedMethods(String var1);
Set<MethodMetadata> getAnnotatedMethods(String var1);
}
MethodMetadata描述的是方法的信息,同时获取方法上的注解信息;
public interface MethodMetadata extends AnnotatedTypeMetadata {
String getMethodName();
String getDeclaringClassName();
String getReturnTypeName();
boolean isAbstract();
boolean isStatic();
boolean isFinal();
boolean isOverridable();
}
spring提供了一个reader去获取元数据信息,内部通过ClassReader去加载resource(java字节码文件),并解析;
final class SimpleMetadataReader implements MetadataReader {
private final Resource resource;
private final ClassMetadata classMetadata;
private final AnnotationMetadata annotationMetadata;
SimpleMetadataReader(Resource resource, @Nullable ClassLoader classLoader) throws IOException {
BufferedInputStream is = new BufferedInputStream(resource.getInputStream());
ClassReader classReader;
try {
classReader = new ClassReader(is);
} catch (IllegalArgumentException var9) {
throw new NestedIOException("ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: " + resource, var9);
} finally {
is.close();
}
AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(classLoader);
classReader.accept(visitor, 2);
this.annotationMetadata = visitor;
this.classMetadata = visitor;
this.resource = resource;
}
public Resource getResource() {
return this.resource;
}
public ClassMetadata getClassMetadata() {
return this.classMetadata;
}
public AnnotationMetadata getAnnotationMetadata() {
return this.annotationMetadata;
}
}