2013-12-11 21 views
5

我使用階以下的方法來獲取類中的所有字段的保持:查找類領域合成成員斯卡拉

val fields = contract.getClass.getDeclaredFields.toList.map(value => { 
    value.setAccessible(true) 
    value.getName 
}) 

contract已被定義爲在我的代碼的類。 由於我使用反射,問題是我得到另一個元素$jacocoData作爲其中一個字段。我想忽略這個領域。 'hacky'這樣做的方式是知道它總是附加在列表的末尾,所以我可以通過更改我的函數簽名來修復它,以包括productArity,並且只需要第一個arity元素這樣的:

def getFields(contract: Contract, arity: Int): List[String] = { 
    val fields = contract.getClass.getDeclaredFields.toList.map(value => { 
    value.setAccessible(true) 
    value.getName 
    }) 
//to ignore $jacocoData (Java code coverage) field 
val firstnFields = fields.take(arity) 
firstnFields 
} 

this FAQ最後一點,我需要擺脫掉一類的合成成員。我怎麼做?

回答

6

簡單地假設$jacocoData始終是最後一個元素是危險的,因爲Class#getDeclaredFields()does not guarantee any order

要檢查字段是否是合成使用Field#isSynthetic(),使你的代碼可以改爲:

val fields = contract.getClass.getDeclaredFields. 
toList.withFilter(!_.isSynthetic()).map(value => { 
    value.setAccessible(true) 
    value.getName 
})