AnnotatedElement

发布时间 2023-12-29 18:23:29作者: ccblblog

1、元素与注解的四种关系

  • 直接存在(directly present)

直接存在或者直接引用。当一个注解直接在元素上引用时,则为直接引用,比如下面代码,@Configuration就是直接引用在类FilterConfig

image

  • 间接存在(indirectly present)

间接存在或间接引用。当一个注解A并没有注解引用在一个类E上,但是包含这个注解A的注解B被E直接引用了,这属于E对A的间接引用。@Component就是间接引用在类FilterConfig

image

  • 存在(present)

存在或引用。有直接存在间接存在着两种情况的都属于存在类型,
1、注解A直接存在或者间接存在元素E上,则A存在元素E上
2、注解A(用@Inherited标识注解)直接引用于E类的超类F,那么E与A的关系则为引用关系,@Configuration存在类XssFilterConfig

image

  • 关联(associated)

1、直接引用关系
2、间接引用关系
3、引用关系
4、一个注解A(用@Inherited标识注解)与E类的超类F相关联,那么E与A的关系也为关联关系

2、AnnotatedElement方法跟关联关系对应表

方法名称 直接存在 间接存在 存在 关联
T getAnnotation(Class<T>)
Annotation[] getAnnotations()
T[] getAnnotationsByType(Class<T>)
T getDeclaredAnnotation(Class<T>)
Annotation[] getDeclaredAnnotations()
T[] getDeclaredAnnotationsByType(Class<T>)

3、AnnotatedElement(接口)

3.1 AnnotatedElement类图

直接一级子接口 AnnotatedType、GenericDeclaration、TypeVariable
直接实现一级实现子类 Parameter、AccessibleObject

image

  • 方法
    // 判断元素上是否存在某类型注解(存在)
    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
	
    // 获取元素上某类型的注解(存在)
    <T extends Annotation> T getAnnotation(Class<T> annotationClass);
    
    // 获取元素上的所有的注解,返回数组(存在)
    Annotation[] getAnnotations();
    
    // 获取元素上指定类型的注解(关联)
    default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
    
    // 获取元素上指定类型的注解(直接存在)
    default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
    
    // 获取元素上直接存在的注解(直接存在)
    Annotation[] getDeclaredAnnotations();

    // 获取元素指定类型的注解(直接存在)
    default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)