0
同じField
のgetAnnotation()
をパラメータとして同じClass<? extends Annotation>
と呼び出すと、結果は常に注釈のclass
の同じインスタンスになりますか?注釈への参照は一定ですか?
私はAnnotations
がキャッシュされていることを知っていますが、このインスタンスに依存する危険性のあるキャッシュ/何かをクリアするものがありますか?
同じField
のgetAnnotation()
をパラメータとして同じClass<? extends Annotation>
と呼び出すと、結果は常に注釈のclass
の同じインスタンスになりますか?注釈への参照は一定ですか?
私はAnnotations
がキャッシュされていることを知っていますが、このインスタンスに依存する危険性のあるキャッシュ/何かをクリアするものがありますか?
はい。
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;
あなたがgetAnnotation
のソースコードを見てみると次のように読み込みます要約すると、アノテーションはマップに格納され、取得されたアノテーションは戻されます。
通常これは当てはまりますが、複数のクラスローダーを使用している場合は、すべてのベットはオフになっています。 –
@JimGarrison同じ名前/クラス名を持っていても、それは異なる「Field」になります。 –