Scala:从类中获取单例对象

时间:2016-07-13 12:59:00

标签: 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]

1 个答案:

答案 0 :(得分:2)

关于SO的讨论有很多不同的方法。 其中一个我在对你的问题的评论中提及。 这是另一个,使用"官方"斯卡拉反射:Get companion object instance with new Scala reflection API

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

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

请注意,类T的伴随对象不必是T的实例,因此getSingletonInstance的声明始终有效。

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