功能介绍
读取类的信息,如类名、修饰符、内部类、外部类、父类、接口名称、成员方法、注解、注解的元注解等
代码演示
注解@Zhy上打了注解@Zhy2,ZhyConcret类上打了@Zhy注解:
@Zhy
public class ZhyConcret {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Zhy2
public @interface Zhy {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Zhy2 {
}
读取ZhyConcret.class:
//获取到类资源,使用上篇记录的ResourcePatternResolver获取到类资源
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("org/springframework/core/type/classreading/ZhyConcret.class");
//对类资源进行读取
SimpleMetadataReader simpleMetadataReader = new SimpleMetadataReader(resources[0], ClassLoader.getSystemClassLoader());
读取结果:
展开annotations属性,里面记录注解以及注解的元注解信息
整体设计
元数据的定义和实现
AnnotatedTypeMetadata: 可被注解标注的元数据都继承自这个接口,这里定义了通用方法如获取所有注解,判断是否被某个注解标注等等,MethodMetadata和AnnotationMetadata都继承自AnnotatedTypeMetadata,说明这些元数据是可以被注解标注的
ClassMetadata: 类的元数据定义,用来记录类的信息,实现类有SimpleAnnotationMetadata
AnnotationMetadata: 注解的元数据定义,用来记录注解信息。因为注解本质是一个继承了Annotation的接口,所以继承了ClassMetadata。实现类有SimpleAnnotationMetadata
MethodMetadata: 方法的元数据定义,用来记录方法的信息,实现类有SimpleMethodMetadata
类的读取和访问实现(访问者设计模式)
ClassReader: 读取类信息,传递给访问者
ClassVisitor: 类的访问者,ClassReader读取到类信息会传递给访问者,访问者将数据封装成SimpleAnnotationMetadata元数据。实现类有SimpleAnnotationMetadataReadingVisitor
AnnotationVisitor: 注解访问者,将数据封装成TypeMappedAnnotation,ClassVisitor中依赖AnnotationVisitor,当访问结束时回调ClassVisitor的方法将数据传递给ClassVisitor。实现类有MergedAnnotationReadingVisitor
MethodVisitor: 方法访问者,将数据封装成SimpleMethodMetadata元数据,ClassVisitor中依赖MethodVisitor,当访问结束时回调ClassVisitor的方法将数据传递给ClassVisitor。实现类有SimpleMethodMetadataReadingVisitor
合并注解定义和实现
MergedAnnotation: 合并的注解定义,实现类TypeMappedAnnotation内部使用AnnotationTypeMapping保存注解的映射关系
MergedAnnotations: 是MergedAnnotation的集合类,实现类MergedAnnotationsCollection使用了AnnotationTypeMappings扫描注解的元注解信息并存储到MergedAnnotation[ ] 类型的成员变量中
注解类型映射的实现
AnnotationTypeMapping: 注解类型映射类,这里保存了注解上上下级关系,处理了注解的别名,内部有一个Map<Methed, List> 的aliasedBy保存了别名的映射关系,key是value集合元素的别名
AnnotationTypeMappings: 注解类型映射类的集合,扫描获取了注解的元注解,每个元注解封装成AnnotationTypeMapping,并做了缓存。内部使用AnnotationsScanner扫描元注解,AnnotationsScanner中使用AnnotationFilter对注解进行过滤
AnnotationFilter: 注解过滤器定义,定义了校验的方法。实现类PackageAnnotationFilter包注解过滤器,作用是根据注解的包名进行匹配
AnnotationsScanner: 扫描注解器,作用是扫描注解上的注解,使用PackageAnnotationFilter对注解进行过滤
MetadataReader定义与实现
MetadataReader: 元数据读取,本篇主要介绍的,内部注解或间接使用了上面介绍的类。实现类只有SimpleMetadataReader
类之间的关系如下图:
SimpleAnnotationMetadataReadingVisitor定义了注解、方法等访问方法,ClassReader接收类文件的输入流和SimpleAnnotationMetadataReadingVisitor做为参数,开始读取类,并回调访问者中的方法,将信息传递给访问者,访问者保存信息,访问结束的时候封装成对用的元数据。