Scala:从类中获取单例对象



当我只有类时,是否可以在 Scala 中获取对象的单例实例?考虑

object A {}
def getSingletonInstance[T](x: Class[T]): Option[T] = {
  // output the singleton, if x is a singleton class i.e. defined by an object
  // is this possible?
}
getSingletonInstance(A.getClass) // --> should return Some[A]

关于SO有很多问题,讨论不同的方法。我在评论您的问题时提到了其中之一。这是另一个,使用"官方"scala反射:使用新的Scala反射API获取配套对象实例

如果你不介意一种方法,涉及一点"黑客攻击"(比如使用一些非官方/未记录/重合的功能而不是官方的API),你可以用这样的东西更容易做到:

val clazz = Class.forName(x.getName + "$")
val singleton = clazz.getField("MODULE$").get(clazz)

请注意,类 T 的伴随对象不一定是 T 的实例,因此getSingletonInstance的声明并不总是有效。

编辑我没有意识到您将对象本身的类传递给您的函数,而不是同伴类。在这种情况下,您无需在上面的代码中附加美元符号,甚至根本不需要第一行。你可以做x.getField("MODULE$").get(x)

最新更新