spring-相关知识点-SimpleAnnotationMetadata

SimpleAnnotationMetadata

具体的实现我们不去深究,因为深究了其实并没有太大的意义,就好比业务开发一样,我们需要知道的是整个业务,难道业务里面的 所有 基础我们都得需要知道嘛?
是基于 ASM 的实现.

关系继承图

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);
}

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();

}

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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值