2013-12-11 7 views
5

Я использую следующий метод в Скале разжиться всех полей в классе:Найти синтетические элементы в полях класса в Scala

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

contract был определен как класс в моем коде. Поскольку я использую отражение, проблема в том, что я получаю еще один элемент $jacocoData как одно из полей. Я хочу игнорировать это поле. «Хакерный» способ сделать это состоит в том, чтобы знать, что он всегда добавляется в конце списка, поэтому я могу «исправить» его, изменив свою подпись функции, включив 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 
})