2014-09-28 42 views
6

之前的,我用来声明手工包装注释,与阵列,然后调用它像这样:订单自动换@Repeatable注释

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

由于我形成阵列与{ ... }初始化,稍后通过反射访问此方法时,该命令与声明的顺序相比更为明显。

但是,当我使用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() {} 

,一切似乎完美的工作(通过反射访问时),但我不想依赖无证材料。对我来说,看起来应该是这样,但我无法在任何地方找到它!任何人都可以阐明这一点吗?

回答

9

这里的Java Language Specification说什么:

如果声明上下文或类型方面有重复的注释类型T的多个注释,那么它是因为如果上下文没有明确声明类型T和一个注解含有注释类型T的隐式声明注释。

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

(重点煤矿)

所以,是的,在容器注解注释的顺序是一样的重复注释声明的顺序。

+0

谢谢!现在我感到安全使用这:) – 2014-09-28 17:47:10