2011-10-10 24 views
8

爲了我的應用程序的目的,我需要能夠找到類型的字段列表(不是實例)以及運行時這些字段的類型。到目前爲止,我只能得到一個case類的方法列表,其中包含了使用classOf[MyCaseClass].getMethods的getter,並且從簡單的類中沒有任何用處。我錯過了什麼嗎?有沒有用於這種用途的反射庫?那是如何正確完成的?Scala Class.getFields

+0

我很困惑 - 標題說字段,然後你去尋找方法。你要哪個? –

+1

相關http://stackoverflow.com/q/7477248/97777 –

+0

謝謝鄧肯,我會研究它。我去尋找方法來查找具有與其字段相對應的名稱和類型的屬性。 –

回答

17

使用Scala的2.10反思:

scala> import reflect.runtime.{universe => ru} 
import reflect.runtime.{universe=>ru} 
scala> trait A { val field1: Int; val field2: Char; def meth1: Int } 
defined trait A 
scala> val fieldSymbols = ru.typeOf[A].members.collect{ case m: ru.MethodSymbol if m.isGetter => m } 
fieldSymbols: Iterable[reflect.runtime.universe.MethodSymbol] = List(value field2, value field1) 

返回的符號包含所有類型的信息,例如:

scala> fieldSymbols.map(_.typeSignature) 
res16: Iterable[reflect.runtime.universe.Type] = List(=> scala.Char, => scala.Int) 
+1

好東西 - 你可能想在那裏添加一個答案! –

+0

發表!任務完成了,現在我可以去睡覺了。 –

+0

'collect {case m:ru.MethodSymbol if m.isGetter => m}''MethodSymbol'給出警告「抽象類型模式ru.MethodSymbol未被選中,因爲它被擦除」。目前還不確定如何消除它。 –

6

你可能想看看這個document on reflecting scalagetMethods是Java反射的一種方法。你在那裏找不到什麼?從Javadoc

  • String getName():以String形式返回由此Method對象表示的方法的名稱。
  • Class [] getParameterTypes():返回一個Class對象數組,它以聲明順序表示由此Method對象表示的方法的形式參數類型。
  • 類getReturnType():返回一個Class對象,該對象表示由此Method對象表示的方法的正式返回類型。

您可以閱讀更多關於Java reflection

請注意,由於erasure,並非所有類型的信息在運行時都可用。

+0

謝謝我對這個項目的瞭解,實際上已經下載了它們的lib,但由於它與我正在使用的2.9.1有太多的衝突,所以我無法編譯它。你不需要向我解釋Java反射。我在尋找的是在Scala中處理它的乾淨方式。我用反射的問題是Scala字段根本就沒有呈現,'getMethods'返回一堆生成的方法需要過濾掉,我希望有一個一致的算法。猜猜我必須分析* Mirrors *代碼。 –

+0

看起來像你的問題是http://stackoverflow.com/questions/2204057/reflection-api-for-scala然後複製。 – schmmd

+0

鏈接已死,更新的鏈接將不勝感激(我不知道要尋找什麼)。 –