我創建了一個具有一些屬性的普通Groovy類(即Person類)。現在我想讓他們的順序得到那些聲明的屬性(我在我的類中定義的),但我不知道該怎麼做。
我試過使用Person.metaClass.getProperties(),但它不僅檢索聲明的屬性,而且還檢索內置的Groovy屬性。
您能否幫我解決這個問題:只需在聲明時按順序獲取聲明屬性。
非常感謝!我們可以通過它的順序獲取Groovy類的聲明屬性嗎?
2
A
回答
7
我看不到用例,但編譯器可以在創建字節碼時重新排列所有字段的聲明。我非常確定排序不是對字段的限制,儘管它應該大部分都是未修改/增強類的情況
根據JVM規範,生成的字段應該在字節碼中標記爲SYNTHETIC(如生成的方法)這樣你就可以測試:
Person.getDeclaredFields().grep { !it.synthetic }
和篩選的基礎Groovy的領域,如的ClassInfo,metaClass上和其他人通過__timestamp
開始,但是我不是一個專家,有可能是另一種方式,我不認爲的
2
有一個關於這個問題mailing list back in February of this year
答案是,沒有。沒有辦法在沒有做額外工作的情況下按照在課堂中聲明的順序獲取屬性。
- 您可以解析爲類的源文件,並生成屬性名稱從
- 有序列表你可以寫一個自定義的註釋,以及與此註釋即註釋字段:
@Order(1) String prop
- 你可以使所有重要的類都實現一個接口,強制它們有一個方法按順序返回屬性的名稱。
除此之外,你可能希望有一個重新思考:-(
+0
快速搜索「jvm spec field order」給了我[這個鏈接](http://code.google.com/p/javastruct/wiki/HowToUseJavaStruct)來加強你的觀點;-) – Grooveek 2011-05-20 09:38:04
相關問題
- 1. 我們可以初始化集合屬性,當我們在類中聲明它
- 2. 如何以與聲明相同的順序讀取類屬性?
- 3. Groovy:如何獲得以基類聲明的屬性
- 4. 我可以通過php POST獲取對象的屬性嗎?
- 5. 以特定順序獲取類屬性
- 6. 按聲明的順序使用反射獲取屬性
- 7. 我可以信任JavaScript中的聲明執行順序嗎?
- 8. 我們可以聲明式設置Web控件的Style屬性嗎?
- 9. 一個靜態字段可以獲取它聲明的類的名字嗎?
- 10. 我可以通過它的類型獲取C#委託的簽名嗎?
- 11. 你可以控制TagBuilder類呈現屬性的順序嗎?
- 12. 我們可以設置一個類的對象的屬性嗎?
- 13. 你可以聲明Angular 2中的Attribute指令的順序嗎?
- 14. 我可以通過表名獲取模型類的名稱嗎?
- 15. 我可以在Chef屬性聲明中使用雙引號嗎?
- 16. 可以通過子類訪問父類的屬性數據嗎?
- 17. 我可以通過屬性名稱設置屬性嗎?
- 18. 獲取屬性列表(通過反射)時,我們是否可以排除ReadOnly?
- 19. WPF - 可以通過它們的值獲取所有UI控件
- 20. 我可以通過WCF保證IEnumerables的插入順序嗎?
- 21. 我們可以通過腳本刪除HTML5 Canvas標籤的「getContext」屬性嗎?
- 22. 我們可以在swift中通過計算屬性中的參數嗎?
- 23. Groovy:字段屬性被聲明多次
- 24. 是否有可能通過它的值獲取屬性c#
- 25. 我可以聲明父級的CSS嗎?
- 26. 我們可以通過intent傳遞singleton類的對象嗎?
- 27. RTTI:我可以通過名稱獲取類型嗎?
- 28. 我可以在預先聲明的類中使用類型嗎?
- 29. 我們真的可以通過CUDA流獲得性能提升嗎?
- 30. 我可以通過Velocity中的屬性名稱訪問嗎?
+1''Person.declaredFields.grep {it.synthetic!} - !得心應手:-D – 2011-05-20 09:34:59
+ 1 for synthetic! – 2011-05-24 08:04:36