对匿名对象的scala反射

给定一个匿名对象:

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

如何使用Scala的反射来获取有价值的a

我曾尝试使用java反射,这是微不足道的。 但是用scala反射,它并不明显。

这是我所尝试过的:

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)
}

但遇到一个例外:

线程“main”中的异常scala.ScalaReflectionException:预期匿名类$ anon $ 1的成员,您提供了值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)

看来运行时类型不是scala反射所能识别的类型。

链接地址: http://www.djcxy.com/p/76531.html

上一篇: scala reflection on anonymous object

下一篇: define in companion object or as inner class