Field#getAnnotations() 和 Field#getDelaredAnnotations() 之间的区别

2022-09-01 21:15:07

JavaDoc说:

AccessibleObject#getDelaredAnnotations

返回直接存在于此元素上的所有批注。与此接口中的其他方法不同,此方法忽略继承的批注。(如果此元素上没有直接存在的批注,则返回长度为零的数组。此方法的调用方可以自由地修改返回的数组;它对返回给其他调用方的数组没有影响。

Field#getAnnotations

返回此元素上存在的所有批注。(如果此元素没有批注,则返回长度为零的数组。此方法的调用方可以自由地修改返回的数组;它对返回给其他调用方的数组没有影响。

因为 是从 类 继承的,所以有 Field 对象可以访问它。getAnnotationsjava.lang.reflect.AccessibleObject

据我所知,这是它们之间忽略继承注释的唯一区别。我在处理类时得到了这一点,但据我所知,字段不能继承注释。getDeclaredAnnotations


答案 1

查看源代码给出了答案:

摘自java.lang.reflect.AccessibleObject

/**
 * @since 1.5
 */
public Annotation[] getAnnotations() { 
    return getDeclaredAnnotations();
}

/**
 * @since 1.5
 */
public Annotation[] getDeclaredAnnotations()  {
    throw new AssertionError("All subclasses should override this method");
}

由于 Field 不覆盖 getAnnotations():被调用。getDeclaredAnnotations()

因此,当在 java.lang.reflect.Field 对象上调用时,这两种方法都会执行相同的操作。(所以JavaDoc在我看来是错误的)

另一种情况是java.lang.Class,它覆盖了这两种方法(并执行JavaDoc所说的;)):

/**
 * @since 1.5
 */
public Annotation[] getAnnotations() { 
    initAnnotationsIfNecessary();
    return AnnotationParser.toArray(annotations);
}

/**
 * @since 1.5
 */
public Annotation[] getDeclaredAnnotations()  {
    initAnnotationsIfNecessary();
    return AnnotationParser.toArray(declaredAnnotations);
}

答案 2

getDeclaredAnnotations() 仅在 getAnnotations() 提供直接实现的注释以及来自其父类的可继承注释(@Inherited)的情况下才提供直接实现的注释。


推荐