我目前正在尝试改进Dsl,而我想要做的是使预定义的字段类型能够“知道”'它自己的名字。我可以使用override def delayedInit(body:=> Unit)和反射来实现这一点,但我希望这能支持递归数据结构的惰性eval。
所以我有一个粗略的方法如下:
class NamedProperty {
var name:String = ""
}
class HasNamed extends App {
val myName = new NamedProperty
lazy val thisWontWork = new NamedProperty
override def delayedInit(body: => Unit) = {
body
this.getClass.getMethods.foreach(m =>
if (classOf[NamedProperty].isAssignableFrom(m.getReturnType) && m.getTypeParameters.isEmpty) {
m.invoke(this) match {
case prop:NamedProperty =>
prop.name = m.getName
case _ =>
}
}
)
}
}
不幸的是,上面将解决懒惰的thisWontWork属性,因为我需要它只在被调用后才能解析它的名字