文章目录
前言
继承图
StandardAnnotationMetadata
- 该类主要继承了 StandardClassMetadata ,具有了操作 Class 相关的内容
- 实现了 AnnotationMetadata
AnnotationMetadata
- 描述注解的元数据
// @since 2.5
public interface AnnotationMetadata extends ClassMetadata, AnnotatedTypeMetadata {
//获取当前类上所有的注解的全类名
Set<String> getAnnotationTypes();
// 获取当前类上指定注解的注解类型
// 比如:@Component 的注解类型就是 @Indexed
// 比如:@Service 的注解类型就是 @Component和@Indexed
// 注意:annotationName 是全类名 ,也就是 xx.xx.xx.Component
Set<String> getMetaAnnotationTypes(String annotationName);
// 是否包含指定注解
// 注意:annotationName 是全类名 ,也就是 xx.xx.xx.Component
boolean hasAnnotation(String annotationName);
// 判断注解类型自己是否被某个元注解类型所标注
// 比如:@Service 的注解类型就是 @Component,如果 metaAnnotationName 是 xx.xx.xx.Component 就会返回 true
// 比如:比如我只需要传递 xx.xx.xx.@Component 注解 如果返回 ture 就代表了是一个标准的 Bean
// 注意:metaAnnotationName 是全类名 ,也就是 xx.xx.xx.Component
boolean hasMetaAnnotation(String metaAnnotationName);
// 类中只要有方法标注有指定注解,就返回true
// 注意:annotationName 是全类名 ,也就是 xx.xx.xx.Bean
boolean hasAnnotatedMethods(String annotationName);
// 返回所有的标注有指定注解的 方法 元数据
Set<MethodMetadata> getAnnotatedMethods(String annotationName);
}
AnnotatedTypeMetadata
- 对注解元素的封装适配
// @since 4.0
public interface AnnotatedTypeMetadata {
// 此元素是否标注有此注解~~~~
// 注意:annotationName 是全类名 ,也就是 xx.xx.xx.Component
boolean isAnnotated(String annotationName);
// 取得指定类型注解的所有的属性 - 值(k-v)
// 注意:annotationName 是全类名 ,也就是 xx.xx.xx.Component
@Nullable
Map<String, Object> getAnnotationAttributes(String annotationName);
// 取得指定类型注解的所有的属性 - 值(k-v)
// annotationName:注解全类名
// classValuesAsString:若是true表示 Class用它的字符串的全类名来表示。这样可以避免Class被提前加载
@Nullable
Map<String, Object> getAnnotationAttributes(String annotationName, boolean classValuesAsString);
// 取得指定类型注解的所有的属性 - 值(k-v)
// annotationName:注解全类名
@Nullable
MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationName);
// 取得指定类型注解的所有的属性 - 值(k-v)
// annotationName:注解全类名
// classValuesAsString:若是true表示 Class用它的字符串的全类名来表示。这样可以避免Class被提前加载
@Nullable
MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationName, boolean classValuesAsString);
}
ClassMetadata
ClassMetadata:对Class
的抽象和适配
此接口的所有方法,基本上都跟 Class 有关。
public interface ClassMetadata {
// 获取className
String getClassName();
// 判断当前 是不是 接口
boolean isInterface();
//判断是否是注解
boolean isAnnotation();
// 判断是否是抽象
boolean isAbstract();
// 是否允许创建 不是接口且不是抽象类 这里就返回true了
default boolean isConcrete() {
return !(isInterface() || isAbstract());
}
// 判断 当前类是否 是 final
boolean isFinal();
// 是否是独立的(能够创建对象的) 比如是Class、或者内部类、静态内部类
boolean isIndependent();
// 如果当前类是内部类则返回 true
default boolean hasEnclosingClass() {
return (getEnclosingClassName() != null);
}
// 如果当前类为内部类,则获取外部类的全限定类名
@Nullable
String getEnclosingClassName();
// 基本都是true,只有当类型是 Object的时候才是false.. 也就是说 Object 不存在父类
default boolean hasSuperClass() {
return (getSuperClassName() != null);
}
// 获取父类的ClassName
@Nullable
String getSuperClassName();
// 会把实现的所有接口名称都返回
String[] getInterfaceNames();
// 返回类中定义的公共、私有、保护的内部类
String[] getMemberClassNames();
}
StandardClassMetadata
- 该类主要是实现了 ClassMetadata 的操作,而我们的 StandardAnnotationMetadata 继承了 StandardClassMetadata ,
- 通过注释我们得知,该类是实现都是基于反射实现的…
public class StandardClassMetadata implements ClassMetadata {
// 目标类,
private final Class<?> introspectedClass;
// 获取目标类
public final Class<?> getIntrospectedClass() {
return this.introspectedClass;
}
}