我有一个案例课:
case class Cow(breed: Breed, gender: Gender)(implicit grass: Pasture) {
val hasSpots: Boolean
}
如何在运行时使用反射来仅获取列表(breed
,gender
)?这是行不通的:
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
参数,我也不希望这样做。
是否有某种方法可以只返回(breed
,gender
)字段?
答案 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")