【问题标题】:Find synthetic members in class fields in Scala在 Scala 的类字段中查找合成成员
【发布时间】:2013-12-29 10:31:18
【问题描述】:

我在 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
 }

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

【问题讨论】:

    标签: scala reflection jacoco synthetic


    【解决方案1】:

    简单地假设$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
     })                                              
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 2016-08-21
      • 1970-01-01
      • 2010-10-22
      • 2015-05-21
      • 2011-01-30
      • 2014-03-01
      • 2013-02-22
      • 2023-04-07
      相关资源
      最近更新 更多