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

时间:2013-12-11 12:37:50

标签: scala reflection jacoco synthetic

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

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

contract已在我的代码中定义为一个类。 由于我使用反射,问题是我得到另一个元素$jacocoData作为其中一个字段。我想忽略这个领域。 “hacky”这样做的方法是知道它总是附加在列表的末尾,因此我可以通过将我的函数签名更改为包含productArity来“修复”它,并且仅采用第一个{ {1}}这样的元素数量:

arity

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

1 个答案:

答案 0 :(得分:7)

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