2013-12-11 17 views
5

sınıf alanlarında sentetik üyelerini bulun:Bir sınıfa tüm alanları yakalayabilmeleri scala aşağıdaki yöntemi kullanıyorum Scala

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

contract benim kodda bir sınıf olarak tanımlanmıştır. Yansıma kullanıyorum, sorun alanlardan biri olarak $jacocoData başka bir öğe almamdır. Bu alanı görmezden gelmek istiyorum. Bunu yapmanın 'hacky' yolu, listenin sonuna her zaman eklenmiş olduğu gerçeğini bilmek, böylece productArity'u dahil etmek için işlev imzamı değiştirerek 'düzeltebilirim' ve yalnızca ilk arity gibi öğeleri Bu:

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 son noktaya göre, bir sınıfın sentetik üyelerini kapalı kurtulmak gerekir. Bunu nasıl yaparım?

cevap

6

Sadece $jacocoData her zaman son öğenin Class#getDeclaredFields()does not guarantee any order olarak tehlikeli olduğunu varsayarak.

saha sentetik kullanım Field#isSynthetic() olup olmadığını kontrol etmek için, bu nedenle kod şekilde değiştirilebilir:

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