How to access a field's value via reflection (Scala 2.8)

soc picture soc · Apr 17, 2010 · Viewed 11.9k times · Source

Consider the following code:

class Foo(var name: String = "bar")

Now i try to get the value and the correct type of it via reflection:

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

I tried things like field.get(foo), but that just returns an java.lang.Object but no String. Basically I need the correct type, because I want to invoke a method on it (e. g. toCharArray).

What is the suggested way to do that?

Answer

Ben Lings picture Ben Lings · Apr 17, 2010

As others have mentioned, the reflection methods return Object so you have to cast. You may be better using the method that the Scala compiler creates for field access rather than having to change the visibility of the private field. (I'm not even sure if the name private field is guaranteed to be the same as that of the accessor methods.)

val foo = new Foo
val method = foo.getClass.getDeclaredMethod("name")
val value = method.get(foo).asInstanceOf[String]