2016-05-27 15 views
1

Java 8反復可能アノテーションをサポートする方法を理解しようとしています。Java 8反復可能アノテーション

次のとおりです。 https://blog.idrsolutions.com/2015/03/java-8-repeating-annotation-explained-in-5-minutes/

は、それが完璧に動作します。

しかし、私がこの例を修正し、Carクラスの@Manufacturerを追加すると、その単一の注釈を読み取ることができません。したがって、繰り返されるアノテーションの出現が1つしかない場合、それは読み取ることができません。

そう持つ:

@Manufacturer("Range Rover") 
public class Car { 

} 


Manufacturer[] a = Car.class.getAnnotationsByType(Manufacturer.class); 

ここサイズは車でNPEがあるだろう、ここで0

Cars cars = Car.class.getAnnotation(Cars.class); 
for(Manufacturer car: cars.value()) 
System.out.println(car.value()); 

になります。..

それはなぜですか?

+1

リフレクションでアノテーションにアクセスするには、 '@Retention(RUNTIME)'とマークする必要があります。あなたの車の注釈はこれを持っていますか? –

+0

はい、確かに問題はないとは言えませんが、複数の注釈でクラスに注釈を付けると機能しますが、1つしかない場合は取得できません。 – darku

答えて

1

をhelpt願っています。

だから少なくとも

おかげショーン、(話すの方法で)容器ベース/単一基づい方法で注釈を読み取りManufacturer注釈に

@Retention(RetentionPolicy.RUNTIME) 

も追加あなたは答えが私に手がかりを与えました...

+1

あなたはタイプ名をミックスしています。 「車」は注釈ではありません。明らかに、複数の「Manufacturer」アノテーション「Cars」を保持するコンテナ注釈の名前を付けることは良い考えではありません。 – Holger

+0

製造元、申し訳ありません。あなたはそうだよ。 – darku

+1

気にしないで。あなたはあなたの答えを編集することができます。それ以外にも、この問題についてブログにコメントを残しておくべきでしょう。 – Holger

1

メーカータイプではなく、タイプCarsの注釈を取得しようとします。

次のソリューションを働いた:

Manufacturer[] annotations = Car.class.getAnnotationsByType(Manufacturer.class); 
    for (Manufacturer annotation : annotations) { 
     System.out.println(annotation.name()); 
    } 

あなたは常にgetAnnotationまたはgetAnnotationsByTypeへの注釈の種類ではなく、クラス自体の型を渡す必要があります。

だから問題はManufacturer注釈がRetentionPolicyが唯一のコンテナ注釈(Cars)宣言されていないということです、それはあなたに

+0

メーカー[] a = Car。 class.getAnnotationsByType(Manufacturer.class);それは私がやっていることです(例のリンクで指定されています)。問題は、Carクラスに2つの@Manufacturerアノテーションがある場合、それらを読み取ることができるということです。私は何かを逃している? – darku

+0

元の質問のチュートリアルを参照してください。あなたは2つの方法でそれらを読むことができます。元の投稿では、私はちょうどそれらの出力を説明しました。これはちょっと混乱していたらごめんなさい... – darku

関連する問題