2011-05-20 80 views
2


我创建了一个具有一些属性的普通Groovy类(即Person类)。现在我想让他们的顺序得到那些声明的属性(我在我的类中定义的),但我不知道该怎么做。
我试过使用Person.metaClass.getProperties(),但它不仅检索声明的属性,而且还检索内置的Groovy属性。
您能否帮我解决这个问题:只需在声明时按顺序获取声明属性。
非常感谢!我们可以通过它的顺序获取Groovy类的声明属性吗?

回答

7

我看不到用例,但编译器可以在创建字节码时重新排列所有字段的声明。我非常确定排序不是对字段的限制,尽管它应该大部分都是未修改/增强类的情况

根据JVM规范,生成的字段应该在字节码中标记为SYNTHETIC(如生成的方法)这样你就可以测试:

Person.getDeclaredFields().grep { !it.synthetic } 

和筛选的基础Groovy的领域,如的ClassInfo,metaClass上和其他人通过__timestamp

开始,但是我不是一个专家,有可能是另一种方式,我不认为的

+1

+1''Person.declaredFields.grep {it.synthetic!} - !得心应手:-D – 2011-05-20 09:34:59

+0

+ 1 for synthetic! – 2011-05-24 08:04:36

2

有一个关于这个问题mailing list back in February of this year

答案是,没有。没有办法在没有做额外工作的情况下按照在课堂中声明的顺序获取属性。

  1. 您可以解析为类的源文件,并生成属性名称从
  2. 有序列表你可以写一个自定义的注释,以及与此注释即注释字段:@Order(1) String prop
  3. 你可以使所有重要的类都实现一个接口,强制它们有一个方法按顺序返回属性的名称。

除此之外,你可能希望有一个重新思考:-(

+0

快速搜索“jvm spec field order”给了我[这个链接](http://code.google.com/p/javastruct/wiki/HowToUseJavaStruct)来加强你的观点;-) – Grooveek 2011-05-20 09:38:04

相关问题