2014-09-28 4 views
6

Раньше я объявить обертка аннотацию вручную, с массивом, а затем вызвать его следующим образом:Порядок автоматически обернутый @Repeatable аннотациями

@Foos({ @Foo(0), @Foo(1), @Foo(2) }) 
public void bar() {} 

Так как я делал массив с { ... } инициализаторах , было более чем ясно, что приказ должен быть тем же самым из декларации, когда я обратился к этому методу позже через Reflection.

Однако, когда я использую новую аннотацию @Repeatable от Java 8, у меня есть гарантия, что заказ будет сохранен?

Я объявил простой набор аннотаций:

public @interface Foos { 
    Foo[] value(); 
} 

@Repeatable(Foos.class) 
public @interface Foo { 
int value(); 
} 

и запустить несколько тестов с самыми разнообразными сценариями:

@Foo(0) @Foo(1) @Foo(2) 
public void bar1() {} 

@Foo(2) 
@Deprecated @Foo(5) 
@Foo(10) 
public void bar2() {} 

и все, кажется, работает без сбоев (при доступе с помощью Reflection), но Я не хотел бы полагаться на недокументированные материалы. Мне кажется очевидным, что так должно быть, но я не могу найти его нигде! Может ли кто-нибудь пролить свет на это?

ответ

9

Вот что Java Language Specification говорит:

Если контекст объявления или контекст типа имеет несколько аннотаций повторяемого типа аннотаций T, то это, как если контекст не имеет явно объявлены аннотации типа T и один неявно объявленную аннотацию содержащего типа аннотации T.

Неявно объявленная аннотация называется аннотацией контейнера, а многочисленные аннотации типа T, которые появились в контексте, называются базовыми аннотациями. Элементы элемента значения (массива) в аннотациях контейнера являются базовыми аннотациями в порядке слева направо, в котором они появились в контексте.

(курсив мой)

Так что да, порядок аннотаций в контейнере аннотации такого же, как и порядок декларирования повторяемых аннотаций.

+0

Спасибо! Теперь я чувствую себя в безопасности, используя это :) –

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