2013-12-11 8 views
5

でクラスフィールドで合成メンバーを探す:私は、クラス内のすべてのフィールドのホールドを取得するにはScalaでは、次の方法を使用していScalaの

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

contractが私のコードでクラスとして定義されています。 私はリフレクションを使用しているので、問題は別の要素$jacocoDataをフィールドの1つとして取得することです。私はこのフィールドを無視したい。それを行う 'ハッキーな'方法は、リストの最後に常に追加されるという事実を知ることです。関数の署名を変更して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 
})            
関連する問題