2016-05-27 2 views
1

Попытка выяснить, как ладить с поддержкой Java 8 Поддержка повторяющихся аннотаций.Java 8 Повторяемая аннотация

После: https://blog.idrsolutions.com/2015/03/java-8-repeating-annotation-explained-in-5-minutes/

это работает безупречно.

Но если я изменяю пример и добавляю только @Manufacturer в классе Car, я не могу прочитать эту единственную аннотацию. Поэтому, если есть только одно появление повторяющейся аннотации, ее невозможно прочитать.

Так наличие:

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

} 


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

размер здесь будет 0

и

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

здесь будет NPE на автомобилях ..

Почему?

+1

Чтобы получить доступ к аннотации через отражение, ее необходимо пометить как '@Retention (RUNTIME)'. Есть ли у вашей автоподписи аннотации? –

+0

Да, конечно, это не проблема, это работает, если я аннотирую класс с несколькими аннотациями, но если есть только один, я не могу его получить. – darku

ответ

1

Таким образом, проблема в том, что Manufacturer аннотаций не имеет RetentionPolicy объявленную только контейнер аннотацию (Cars).

Поэтому добавление

@Retention(RetentionPolicy.RUNTIME) 

также на Manufacturer аннотацию будут читать аннотацию в контейнера на основе/одной основы образом (в манере говорить)

Спасибо Шон, по крайней мере, вы ответили мне подсказкой ...

+1

Вы смешиваете имена типов. «Автомобиль» - это не аннотация. Очевидно, что это не очень хорошая идея, чтобы назвать аннотацию контейнера, содержащую несколько аннотаций «Производитель» «Автомобили» ... – Holger

+0

Производитель, извините! вы правы. – darku

+1

Ничего. Вы можете отредактировать свой ответ. Кроме того, возможно, вы должны оставить комментарий в блоге об этой проблеме. – Holger

1

Вы пытаетесь получить аннотация вида Автомобили, а не типа Пзготовителей.

следующее решение работало:

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

Вы всегда должны передать тип аннотации к getAnnotation или getAnnotationsByType, а не тип самого класса.

Надежда это helpt вам

+0

Производитель [] a = Автомобиль. class.getAnnotationsByType (Manufacturer.class); это то, что я делаю (как указано в ссылке на примере). Проблема в том, что если класс Car имеет 2 аннотации @Manufacturer, я могу их прочитать, если есть только один, я не такой. Я что-то упускаю ?? – darku

+0

См. Учебник в исходном вопросе. Вы можете прочитать их двумя способами, в исходном посте я только что объяснил их вывод ... Простите, если это было немного запутанно ... – darku

Смежные вопросы