2012-07-20 231 views
3

使用Java反射API來獲取方法的參數類型列表,我們可以簡單地使用getParameterTypes使用scala獲取方法參數類型2.10反射API

下面是一個例子:

scala> classOf[String].getMethods.head.getParameterTypes 

res8: Array[Class[_]] = Array(class java.lang.Object) 

什麼是使用新的Scala 2.10反射API來獲得相同的結果,最好的做法?

回答

11

這很難,因爲斯卡拉反射做得更多,需要更多。例如:

  • 類型不會被刪除。類被擦除,但不是類型。
  • Scala支持命名參數,所以你需要參數的名稱。
  • Scala的方法沒有參數列表。

因此,考慮到所有這些,以下是您的操作方法。首先,獲得方法:

val stringMethods: Iterable[MethodSymbol] = typeOf[String].members.collect { 
    case m if m.isMethod => m.asMethod 
} 

斯卡拉反射不(還)提供的方法來列出特定類型的成員(方法,字段,內部類等),所以你需要使用一般members方法。

各類成員的合作,members方法返回的Symbol的迭代,所有符號的最大公約數,所以你需要轉換爲MethodSymbol治療所產生的符號的方法。

現在,假設我們有一個MethodSymbol,我們需要參數的類型。我們可以這樣做:

method.paramss 
+2

Daniel,謝謝你的回答。它運行良好,但我很驚訝scala反射API不封裝這個功能,這似乎是基本的。 – 2012-07-21 08:15:04