有没有办法获得带有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")
感谢提示!
答案 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
,在某些时候你必须为它选择一个类型,它总是会成为静态的 - 就像在源代码中一样。
第二种情况只是使用模式匹配来确保您拥有正确的类型。
我不确定我明白你的意思是第二种情况。