dimanche 10 janvier 2016

scala reflection on anonymous object

Given an anonymous object:

val anon = new {
  val a = BigDecimal(1)
}

How can I use scala reflection to get value of a ?

I have tried using java reflection, it is trivial. But with scala reflection, it is not obvious.

Here is what I have tried:

package test
object ReflectTest extends App {
    val anon = new {
      val a = BigDecimal(1)
    }

    val instanceMirror = currentMirror.reflect(anon)
    val anonType = typeOf[anon.type]
    val anonTermSymbol = anonType.member(newTermName("a")).asTerm
    val anonFieldMirror = instanceMirror.reflectField(anonTermSymbol)
    val result = anonFieldMirror.get
    println(result)
}

But encountered an exception:

Exception in thread "main" scala.ScalaReflectionException: expected a member of anonymous class $anon$1, you provided value test.ReflectTest.<refinement>.a

at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$ErrorNotMember(JavaMirrors.scala:130)
at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$scala$reflect$runtime$JavaMirrors$JavaMirror$$checkMemberOf$1.apply(JavaMirrors.scala:225)
at scala.reflect.runtime.JavaMirrors$JavaMirror.ensuringNotFree(JavaMirrors.scala:214)
at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$checkMemberOf(JavaMirrors.scala:224)
at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaInstanceMirror.reflectField(JavaMirrors.scala:247)
at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaInstanceMirror.reflectField(JavaMirrors.scala:243)

It seems that the runtime type is not the one recognized by scala reflection.





Aucun commentaire:

Enregistrer un commentaire