对Annotations的引用是否不变?

时间:2016-09-07 16:45:47

标签: java annotations

如果我使用与getAnnotation()相同的Field来调用Class<? extends Annotation>,则结果将始终与注释class的实例相同?

我知道Annotations是缓存的,但是有什么东西可以清除缓存/可能会使依赖此实例的风险吗?

1 个答案:

答案 0 :(得分:1)

是。如果你看一下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;

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