2016-09-07 5 views
0

同じFieldgetAnnotation()をパラメータとして同じClass<? extends Annotation>と呼び出すと、結果は常に注釈のclassの同じインスタンスになりますか?注釈への参照は一定ですか?

私はAnnotationsがキャッシュされていることを知っていますが、このインスタンスに依存する危険性のあるキャッシュ/何かをクリアするものがありますか?

+0

通常これは当てはまりますが、複数のクラスローダーを使用している場合は、すべてのベットはオフになっています。 –

+0

@JimGarrison同じ名前/クラス名を持っていても、それは異なる「Field」になります。 –

答えて

1

はい。

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のソースコードを見てみると次のように読み込みます要約すると、アノテーションはマップに格納され、取得されたアノテーションは戻されます。

関連する問題