2016-03-10 38 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