2013-12-11 5 views
5

에 클래스 필드에서 합성 회원 찾기 :I 클래스의 모든 필드를 잡아 스칼라에서 다음과 같은 방법을 사용하고 스칼라

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이 항상 마지막 요소라고 가정하면 does not guarantee any order과 같이 위험합니다.

은 필드가 합성 사용 Field#isSynthetic()인지 여부를 확인하려면, 그래서 당신의 코드를 변경할 수 있습니다

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