【问题标题】:Accessing Scala nested objects through reflection通过反射访问 Scala 嵌套对象
【发布时间】:2012-03-18 03:07:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: scala inner-classes


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 在将members 更改为member 之后,我获得了一个代表Routes.admin 的mirror.Symbol - 现在要弄清楚如何从它变为实际对象。
    • 虽然我还没有弄清楚如何从符号获得任何有用的东西,但我已经接受了你的回答,因为反射 API 无疑是未来的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多