scala - 在 Scala 的类字段中查找合成成员

标签 scala reflection jacoco synthetic

我在 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的最后一点,我需要摆脱类的合成成员。我怎么做?

最佳答案

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

关于scala - 在 Scala 的类字段中查找合成成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519347/

相关文章:

java - 项目总体代码覆盖率总结

Scala的带对象+的中缀表示法,为什么不可能呢?

mysql - 将 java 类添加到 sbt 程序集

c# - 使用不带反射的字符串获取属性

C# 反射按名称获取字段或属性

jenkins - 达到阈值时如何修复不稳定的构建?

android - 已弃用属性的 Gradle 警告

ScalaTest 相当于 JUnit 的套件?

scala - SBT 在 Build.scala 中指定 java 堆大小

java - 泛型接口(interface)方法参数的实际类型