关于注释+类成员顺序的问题

时间:2009-07-22 14:06:43

标签: java reflection annotations

我想做这样的事情:

public class Foobar {
   @Tag final private int foo;
   @Tag final private int bar;
   @Tag final private int baz;
   @Tag final private int quux;

   static private final TagValidator validator = 
      TagValidator.autoGenerate(Foobar.class);

   public Foobar(Something something)
   {
       validator.validate(something);
       this.foo = something.method1();
       this.bar = something.anotherMethod();
       this.baz = something.someOtherMethod();
       this.quux = something.yetAnotherMethod();
   }
   ... other methods ...
}

其中TagValidator.autoGenerate()使用反射+注释解析来获取我的Foobar类的所有成员,这些成员已被@Tag标记并做了一些蹩脚的乏味无聊的东西,我将需要做的几节课。

我的问题是,它是否会按照声明的顺序看到这些成员?我同意这样做会更安全:

public class Foobar {
   @Tag(0) final private int foo;
   @Tag(1) final private int bar;
   @Tag(2) final private int baz;
   @Tag(3) final private int quux;

   ...
}

但我感到很懒: - )

此外,是否可以使用同名的类和注释?

3 个答案:

答案 0 :(得分:2)

Class.getDeclaredFields()Class.getFields()

上引用JavaDocs
  

返回的数组中的元素是   没有排序,也没有   特别的顺序。

从可维护性角度来看,如果订单很重要,请将其包含在您的注释中,或者更好地依赖订单。

是的,类和注释可以具有相同的名称,只要它们位于不同的包中即可。基本上相同的规则适用于类和接口。

答案 1 :(得分:1)

假设您的TagValidator使用Class.getFields,那么javadoc说:

  

返回包含Field的数组   反映所有可访问的对象   公共领域或   此类表示的接口   宾语。数组中的元素   返回没有排序,不在   任何特定的订单。

所以我不会依赖它。但在实践中,这似乎总是以声明顺序返回。

答案 2 :(得分:0)

我很确定他们确实保留了声明的顺序。我这样说是因为我看到其他项目使用完全相同的技术:http://preon.flotsam.nl/ Preon将java字段绑定到二进制布局,它取决于字段声明的顺序。