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

2024-04-15

我在 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 http://www.eclemma.org/jacoco/trunk/doc/faq.html,我需要摆脱一个类的合成成员。我怎么做?


简单地假设$jacocoData总是最后一个元素是危险的,因为Class#getDeclaredFields() 不保证任何订单 http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredFields%28%29.

检查字段是否是综合使用Field#isSynthetic() http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#isSynthetic%28%29,因此您的代码可以更改为:

val fields = contract.getClass.getDeclaredFields.
 toList.withFilter(!_.isSynthetic()).map(value => {
  value.setAccessible(true)
  value.getName
 })                                              
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Scala 的类字段中查找合成成员 的相关文章

随机推荐