如果我在同一getAnnotation()上以相同的Field作为参数调用Class<? extends Annotation>,结果将始终是注释的class的相同实例吗?

我知道Annotations已被缓存,但是是否有一些东西可能会清除缓存/某些东西,可能会使依赖此实例的风险增加?

最佳答案

是。如果查看getAnnotation的源代码,则其内容如下:

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
    if (annotationClass == null)
        throw new NullPointerException();

    return (T) declaredAnnotations().get(annotationClass);
}


declaredAnnotations方法的编码如下:

private synchronized  Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
    if (declaredAnnotations == null) {
        declaredAnnotations = AnnotationParser.parseAnnotations(
            annotations, sun.misc.SharedSecrets.getJavaLangAccess().
            getConstantPool(getDeclaringClass()),
            getDeclaringClass());
    }
    return declaredAnnotations;
}


declaredAnnotations字段是一个映射:

private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;


总之,注释存储在地图中,并且一旦检索到相同的注释,便会返回它们。

08-03 23:04