2016-12-01 4 views
0

Java 8はrepeating annotationsを導入しましたが、それらを直接サポートしていない既存の構造よりもはっきりさせなければなりませんでした。彼らは@Repeatableメタアノテーションを導入することによって、これをしなかったが、あなたはそこに1だか、オブジェクトの詳細-より-1注釈かどうかに応じて異なる動作を取得:要求されたタイプの複数の注釈が存在する場合繰り返し注釈の値を取得する適切な方法はありますか?

最初にコンテナアノテーションを取得することでそれらを取得できます。

これが唯一の注釈が存在する場合は、がコンテナアノテーションを使用することができないことを意味し、そしてloが-と-見よケースのように表示されます。私は1つ、より-より-1一緒に事件を処理するために、以下に書いたが、それは過度に複雑なようだ:

public static <C, T> List<T> getAnnotations(
    Method m, Class<C> containerClass, Class<T> annotationClass) { 
    C container = m.getAnnotation(containerClass); 
    if (container != null && container.value().length > 0) { 
    return ImmutableList.copyOf(container.value()); 
    } 
    // apparently the @Container isn't considered set unless 
    // there's *repeated* @Annotation elements 
    T annotation = m.getAnnotation(annotationClass); 
    if (annotation != null) { 
    return ImmutableList.of(annotation); 
    } 
    return ImmutableList.of(); 
} 

これについて移動するクリーンな方法はありますか?ドキュメントではAnnotatedElementを使用しても言及していますが、これを使用する方法はわかりません。メソッドはのオブジェクトのみを受け取り、MethodまたはFieldオブジェクトではありません。

+2

[SO docs](http://stackoverflow.com/documentation/java/157/annotations/9902/repeating-annotations#t=201612010146085258575)があるときに、なぜOracleドキュメントを読みますか? ;) – shmosel

+0

@shmoselリンクをいただきありがとうございます、それは正規のドキュメントよりも役に立つSOのドキュメントの素晴らしい例です。 – dimo414

答えて

0

文書の「注釈の取得」セクションは、繰り返し注釈を取得する適切な方法を説明する素晴らしい仕事をしません。彼らは、レガシーコードにとって有用であるとして.getAnnotationByType()と言及し、doesn't existという方法をgetAnnotations(Class<T>)と述べている。

が不足している方法は、最初に私が(それゆえヘルパーメソッド)従来の動作で立ち往生、しかし右の方法は、両方のケースを扱う(そしてボーナスとしてnullを返すことはありません)どの.getAnnotationsByType()ように見えるので、あなたができる私を混同していました単純に言う:

yourMethod.getAnnotationsByType(YourRepeatableAnnotation.class) 

方法が注釈されていない場合、または空の配列上のすべての@YourRepeatableAnnotation注釈を取得します。

関連する問題