如何使用Scala反射仅获取主要的构造函数参数?

时间:2018-06-22 16:32:41

标签: scala reflection

我有一个案例课:

case class Cow(breed: Breed, gender: Gender)(implicit grass: Pasture) {
  val hasSpots: Boolean
}

如何在运行时使用反射来仅获取列表(breedgender)?这是行不通的:

def getConstructorParams[C](implicit ct: ClassTag[C]) =
  ct.runtimeClass.getDeclaredFields.map(_.getName)
  // returns (breed, gender, grass, hasSpots)

def getConstructorParams[C](implicit ct: ClassTag[C]) =
  ct.runtimeClass.getConstructors.head.getParameters.map(_.getName)
  // returns (arg0, arg1, arg2)

第一个解决方案包括非构造函数字段(hasSpots),这不是我想要的。第二种解决方案丢失了参数名称。这两种方法还都包含咖喱的隐式grass/arg2参数,我也不希望这样做。

是否有某种方法可以只返回(breedgender)字段?

1 个答案:

答案 0 :(得分:1)

假设您使用的是scala-reflect API(我在2.12上进行了测试,但它可能在其他版本上也可以使用),

import scala.reflect.runtime.universe._

def getConstructorParams[T: TypeTag] =
    typeOf[T].decl(termNames.CONSTRUCTOR)
             .alternatives.head.asMethod // this is the primary constructor
             .paramLists.head.map(_.asTerm.name.toString)


getConstructorParams[Cow] == List("breed", "gender")