通过反射访问Scala嵌套对象

时间:2012-02-28 16:07:02

标签: scala inner-classes

我有一些像这样的嵌套对象:

object Routes {
  object admin {
    def home = "/admin/home/"
    def module(m:Module) = "/admin/module/"+m.code
  }
}

可通过Routes.admin.module(mymod)等访问。

鉴于Routes对象,我希望能够通过其名称“admin”访问admin对象,以便将其暴露给我正在使用的模板引擎(Freemarker)。这是基于我提出的标准Java Reflection API的解决方案,似乎有用:

val obj = Routes
val key = "admin"
Class.forName(obj.getClass.getName+key+"$").getField("MODULE$").get(null)

这会找到单个对象所在的静态字段Routes$admin$.MODULE$。是否有一种更简洁的方法,不需要嵌入Scala字节码的命名约定知识?

1 个答案:

答案 0 :(得分:2)

使用Scala 2.10M4中的新Reflection API,可以使用:

import scala.reflect.runtime.{universe => u}
val t = u.typeOf[Routes.type]
val adminName = u.newTermName("admin")
val admin = t.member(adminName)
// work with admin