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

Phi*_*der 18 java inheritance annotations

JavaDoc说如下:

AccessibleObject#getDeclaredAnnotations:

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

Field#getAnnotations:

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

由于getAnnotations是从类继承的java.lang.reflect.AccessibleObject,因此Field对象可以访问它.

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

Phi*_*der 10

查看源代码给出了答案:

摘自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");
}
Run Code Online (Sandbox Code Playgroud)

因为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);
}
Run Code Online (Sandbox Code Playgroud)