如何通过反射访问字段的值(Scala 2.8)

soc*_*soc 12 reflection scala field invoke scala-2.8

请考虑以下代码:

class Foo(var name: String = "bar")
Run Code Online (Sandbox Code Playgroud)

现在我尝试通过反射得到它的值和正确的类型:

val foo = new Foo
val field = foo.getClass.getDeclaredField("name")
field.setAccessible(true)
//This is where it doesn't work
val value = field.get(????)
Run Code Online (Sandbox Code Playgroud)

我尝试过像field.get(foo)这样的东西,但是它只返回一个java.lang.Object但没有String.基本上我需要正确的类型,因为我想在它上面调用一个方法(例如toCharArray).

建议的方法是什么?

Ben*_*ngs 6

正如其他人所提到的,反射方法会返回,Object所以你必须进行投射.您可能更好地使用Scala编译器为字段访问创建的方法,而不必更改私有字段的可见性.(我甚至不确定名称私有字段是否保证与访问者方法的名称相同.)

val foo = new Foo
val method = foo.getClass.getDeclaredMethod("name")
val value = method.get(foo).asInstanceOf[String]
Run Code Online (Sandbox Code Playgroud)


ger*_*rra 5

getDeclaredField是 的一种方法java.lang.Class

您必须更改foo.getDeclaredField("name")foo.getClass.getDeclaredField("name")(或classOf[Foo].getDeclaredField("name")) 才能获取该字段。

getType您可以使用类中的方法获取类型Field,但它不会帮助您,因为它返回Class[_]. 鉴于您知道该类型是 String,您始终可以使用以下命令转换返回的值field.get(foo).asInstanceOf[String]