自动包装的@Repeatable注释的顺序

时间:2014-09-28 15:36:30

标签: java annotations java-8

之前,我曾经手工使用数组声明一个包装器注释,然后像这样调用它:

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

由于我使用{ ... }初始化程序创建了一个数组,所以当我稍后通过Reflection访问此方法时,顺序与声明相同是非常清楚的。

但是,当我使用Java 8中的新@Repeatable注释时,我是否保证将保留订单?

我宣布了一组简单的注释:

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访问时),但我不想依赖于未记录的内容。我觉得应该是这样,但我无法在任何地方找到它!任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:10)

这是Java Language Specification所说的内容:

  

如果声明上下文或类型上下文具有可重复注释类型T的多个注释,那么就好像上下文没有显式声明的类型为T的注释和一个隐式声明的包含注释类型T的注释。

     

隐式声明的注释称为容器注释,并且在上下文中出现的类型T的多个注释称为基本注释。 容器注释的(数组类型)值元素的元素是它们在上下文中出现的从左到右顺序的所有基本注释

(强调我的)

所以,是的,容器注释中的注释顺序与可重复注释的声明顺序相同。