2011-05-20 79 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

相關問題