reflection - 在scala中通过字符串名称获取对象实例

标签 reflection scala singleton

我需要由字符串名称定义的对象(或“单个对象”或“伴侣对象”……除类外的任何东西)。换句话说,如果我有:

package myPackage
object myObject

...然后是这样的:
GetSingletonObjectByName("myPackage.myObject") match {
  case instance: myPackage.myObject => "instance is what I wanted"
}

最佳答案

Scala仍然缺少反射API。您可以通过加载伴随对象类来获取伴随对象的实例:

import scala.reflect._
def companion[T](implicit man: Manifest[T]) : T = 
  man.erasure.getField("MODULE$").get(man.erasure).asInstanceOf[T]


scala> companion[List$].make(3, "s")
res0: List[Any] = List(s, s, s)

要获取无类型的伴随对象,可以直接使用该类:
import scala.reflect.Manifest
def companionObj[T](implicit man: Manifest[T]) = { 
  val c = Class.forName(man.erasure.getName + "$")
  c.getField("MODULE$").get(c)
}


scala> companionObj[List[Int]].asInstanceOf[List$].make(3, "s")
res0: List[Any] = List(s, s, s)

这取决于scala映射到Java类的方式。

关于reflection - 在scala中通过字符串名称获取对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913092/

相关文章:

c++ - 在 C++ 中使用带内存屏障的双重检查锁定的正确方法是什么?

java - 为什么在Java中设计单例模式时需要双重检查锁?

java - 调用最接近的拟合方法

Java反射-错误抛出

scala - 如何建模类型安全的枚举类型?

scala swing 与 swt 的跨平台开发

c# - 为方法参数赋值

c# - LINQ group by 查询使用反射(reflect)的属性名称

scala - 使用新属性扩展 scala 集合

multithreading - 高负载的Spring单例bean