如果我使用与getAnnotation()
相同的Field
来调用Class<? extends Annotation>
,则结果将始终与注释class
的实例相同?
我知道Annotations
是缓存的,但是有什么东西可以清除缓存/可能会使依赖此实例的风险吗?
答案 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;
总之,注释存储在地图中,一旦检索到它们就会返回相同的注释。