2015-01-31 183 views
0

有沒有辦法讓scala反射的字段類型?如何使用反射來獲取字段的類型?

讓我們看到標準的反射例如:

scala> class C { val x = 2; var y = 3 } 
defined class C 
scala> val m = ru.runtimeMirror(getClass.getClassLoader) 
m: scala.reflect.runtime.universe.Mirror = JavaMirror ... 
scala> val im = m.reflect(new C) 
im: scala.reflect.runtime.universe.InstanceMirror = instance mirror for [email protected] 
scala> val fieldX = ru.typeOf[C].declaration(ru.newTermName("x")).asTerm.accessed.asTerm 
fieldX: scala.reflect.runtime.universe.TermSymbol = value x 
scala> val fmX = im.reflectField(fieldX) 
fmX: scala.reflect.runtime.universe.FieldMirror = field mirror for C.x (bound to [email protected]) 
scala> fmX.get 
res0: Any = 2 

有沒有辦法做這樣的事情

val test: Int = fmX.get 

這意味着我能「投」的結果反映get的實際類型領域的?否則:是否可以從字符串中反射set?在這個例子中,像

fmx.set("10") 

感謝提示!

回答

2

這是處理...類型在編譯時不知道,所以,基本上,你必須告訴編譯器它應該是什麼類型。你可以這樣做安全與否,是這樣的:

val test: Int = fmX.get.asInstanceOf[Int] 

val test: Int = fmX.get match { 
    case n: Int => n 
    case _  => 0 // or however you want to handle the exception 
} 

需要注意的是,因爲你宣佈testInt,你Int分配給它。即使你保留testAny,在某些時候你必須爲它選擇一個類型,它總是會是靜態的 - 就像在源代碼中那樣。

第二種情況只是使用模式匹配來確保您有正確的類型。

我不確定我明白你的意思是第二種情況。