spring-相关知识点-SimpleAnnotationMetadata

tech2024-08-10  50

文章目录

SimpleAnnotationMetadata关系继承图 AnnotationMetadataClassMetadataAnnotatedTypeMetadata

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)