spring-相关知识点-StandardAnnotationMetadata

前言

继承图

在这里插入图片描述

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;
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值