2013-12-11 13 views
5

Sto usando il seguente metodo in scala per entrare in possesso di tutti i campi di una classe:Trova membri sintetici in campi di classe in Scala

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

contract è stato definito come una classe nel mio codice. Dal momento che sto usando la riflessione, il problema è che ottengo un altro elemento $jacocoData come uno dei campi. Voglio ignorare questo campo. Il modo "hacky" di farlo è sapere che è sempre aggiunto alla fine dell'elenco, quindi posso "aggiustarlo" cambiando la mia firma della funzione per includere productArity e prendere solo il primo numero arity di elementi come questo:

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 
} 

Secondo l'ultimo punto di this FAQ, ho bisogno di sbarazzarsi fuori i membri di sintesi di una classe. Come lo faccio?

risposta

6

Semplicemente supponendo che $jacocoData sia sempre l'ultimo elemento pericoloso, come Class#getDeclaredFields()does not guarantee any order.

Per verificare se un campo è l'uso sintetico Field#isSynthetic(), in modo che il codice può essere modificato a:

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