scala - How can I evaluate a lazy val using reflection? -
using experimental scala 2.10 reflection, when try call fieldmirror.get() on field lazy val, returns null. there way evaluate lazy val using reflection? get() function should no longer return null afterwards.
consider example:
case class person(val firstname: string, val lastname: string) { lazy val name = firstname + " " + lastname } import scala.reflect.runtime.{universe => ru} val runtimemirror = ru.runtimemirror(getclass.getclassloader) val fred = person("fred", "smith") val instancemirror = runtimemirror.reflect(fred) val nameterm = ru.typeof[person].declaration(ru.newtermname("name")).asterm val namelazy = instancemirror.reflectfield(nameterm) namelazy.get >>> res8: = null fred.name >>> res9: string = fred smith namelazy.get >>> res10: = fred smith
i discovered solution. there hidden method gets generated:
case class person(val firstname: string, val lastname: string) { lazy val name = firstname + " " + lastname } import scala.reflect.runtime.{universe => ru} val runtimemirror = ru.runtimemirror(getclass.getclassloader) val fred = person("fred", "smith") val instancemirror = runtimemirror.reflect(fred) val namemethod = ru.typeof[person].member(ru.newtermname("name")).asmethod val namevalue = ru.typeof[person].member(ru.newtermname("name")).asterm val namelazy = instancemirror.reflectfield(namevalue) val namelazymethod = instancemirror.reflectmethod(namemethod) namelazy.get >>> null namelazymethod() >>> res9: string = fred smith namelazy.get >>> res10: string = fred smith
Comments
Post a Comment