如果我在同一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;
总之,注释存储在地图中,并且一旦检索到相同的注释,便会返回它们。