Доступ к вложенным объектам Scala через отражение - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть несколько вложенных объектов, таких как:

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

Доступно через Routes.admin.module(mymod) и т. Д.

Учитывая объект Routes, я хочу иметь возможность доступа к объекту admin по его имени "admin", чтобы предоставить его движку шаблонов, который я использую (Freemarker). Это решение, основанное на стандартном API-интерфейсе Java Reflection API, которое, как мне кажется, работает:

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

Это находит для статического поля Routes$admin$.MODULE$, где живет одноэлементный объект. Есть ли более аккуратный способ, который не требует внедрения знаний об именах для байт-кода Scala?

1 Ответ

2 голосов
/ 29 февраля 2012

С новым Reflection API в Scala 2.10M4 это можно сделать с помощью:

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
...