在Scala中,如何使用反射来获取方法的真实类型的varargs参数

时间:2016-03-10 08:00:46

标签: scala reflection

我正在使用反射来获取参数类型的方法,但是varargs存在一些问题。这是我的代码:

import reflect.runtime.universe._

case class C() {
  def f(x: String*) = x
}

object Main {
  def main(args: Array[String]): Unit = {
    val c = C()
    val r = runtimeMirror(getClass.getClassLoader).reflect(c)
    val x = r.symbol.typeSignature.member(newTermName("f"))
    val params = x.asMethod.paramss.head.map {
      _.typeSignature.typeSymbol
    }
    for (param <- params) {
      println(param)
    }
  }
}

结果是:

> class <repeated>

如何获得真实类型String?或者还有其他方法可以做到吗?

2 个答案:

答案 0 :(得分:0)

使用_.typeSignature.typeArgs.head,因为StringString*的类型参数,而不是typeSymbol

答案 1 :(得分:0)

您的参数x的类型为String*。这就是你所说的:

_.typeSignature.typeSymbol

String*被定义为Seq[String](我们都知道)。这样称呼:

_.typeSignature.typeArgs

会为您提供类型参数,即您想要的String。 顺便说一句。如果您想证明String*Seq,请致电:

_.typeSignature.erasure

所以修改后的代码应该是这样的(省略C类):

val c = C()
val r = runtimeMirror(getClass.getClassLoader).reflect(c)
val x = r.symbol.typeSignature.member(newTermName("f"))
val params = x.asMethod.paramss.head.map {
  _.typeSignature.typeArgs
}
for (param <- params) {
  println(param)
}

它会打印List(String)

享受