2016-03-10 39 views
2

的可变参数的真实类型我正在使用反射来获取参数类型的方法,但有一些可变参数的问题。这里是我的代码:在斯卡拉,如何使用反射来获得方法

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?或者还有其他办法可以做到这一点吗?

回答

0

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

+0

感谢您的帮助,但在TypeSignature我找不到方法“typeArgs”,我使用Scala的2.10 – SleePy

+0

在2.11中添加了此方法。请参阅http://stackoverflow.com/a/15597707/9204以获得2.10选择。 –

+0

在2.11中工作!感谢您的帮助 – SleePy

0

您的参数xString*的类型。这是通过调用得到什么:

_.typeSignature.typeSymbol 

String*被intrepreted为Seq[String](大家都知道)。因此呼吁:

_.typeSignature.typeArgs 

将让你的类型参数,即所需String。 Btw。如果你想证明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)

享受

+0

感谢您的帮助! – SleePy