【问题标题】:Scala: get singleton object from class [duplicate]Scala:从类中获取单例对象[重复]
【发布时间】:2016-11-16 02:07:10
【问题描述】:

当我只有类时,是否可以在 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]

【问题讨论】:

  • 仅适用于运行时反射。
  • 是的,当然,但是运行时反射中是否有足够的信息?我该怎么做?
  • 为什么不def getSingletonInstance[T](x: Class[T]): Option[T]
  • 相应地更新了问题。运行时这应该是相同的,因为我认为类型擦除,所以在解决方案中我们现在可能需要一个asInstanceOf

标签: scala


【解决方案1】:

关于 SO 的许多问题都在讨论不同的方法。 我在对您的问题的评论中引用了其中一个。 这是另一个,使用“官方” scala 反射: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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2022-06-23
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多