如何使用反射获取字段的类型?

时间:2015-01-31 18:39:15

标签: scala reflection types

有没有办法获得带有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 C@5f0c8ac1
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 C@5f0c8ac1)
scala> fmX.get
res0: Any = 2

有没有办法做类似

的事情
val test: Int = fmX.get

这意味着我可以"演员"反射get对场的实际类型的结果?否则:是否可以从字符串中进行反射set?在示例中类似

fmx.set("10")  

感谢提示!

1 个答案:

答案 0 :(得分: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
}

请注意,由于您将test声明为Int,因此 为其分配Int。即使你将test保留为Any,在某些时候你必须为它选择一个类型,它总是会成为静态的 - 就像在源代码中一样。

第二种情况只是使用模式匹配来确保您拥有正确的类型。

我不确定我明白你的意思是第二种情况。