5

我在 scala 中使用以下方法来获取类中的所有字段:

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

contract在我的代码中被定义为一个类。由于我使用的是反射,所以问题是我将另一个元素$jacocoData作为字段之一。我想忽略这个字段。这样做的“hacky”方法是知道它总是附加在列表末尾的事实,所以我可以通过将函数签名更改为包含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
 }

根据这个 FAQ的最后一点,我需要摆脱一个类的合成成员。我怎么做?

4

1 回答 1

7

简单地假设$jacocoData总是最后一个元素是危险的,因为Class#getDeclaredFields() 不能保证任何 order

要检查一个字段是否是综合使用Field#isSynthetic(),因此您的代码可以更改为:

val fields = contract.getClass.getDeclaredFields.
 toList.withFilter(!_.isSynthetic()).map(value => {
  value.setAccessible(true)
  value.getName
 })                                              
于 2013-12-11T13:03:21.333 回答