【发布时间】:2015-11-01 15:21:46
【问题描述】:
上下文
我目前使用 scala 2.11.6,未来可能使用 2.11.7。 鉴于类路径中已编译的类文件,我想做两件事:
-
查找实现某个接口的任何对象的名称:
trait Service trait ServiceFactory { def create(): Service } ... package my.package object MyServiceFactory extends ServiceFactory { def create(): Service = new Service() }这里的名称类似于
my.package.MyServiceFactory,因为它实现了ServiceFactory特征。 -
给定对象的完全限定名,我想获取对对象实例的引用。
val factory = getInstance[ServiceFactory]("my.package.MyServiceFactory") val service = factory.create()
问题
这两种情况的问题是验证类型继承并确保它是一个单例对象。
检查课程似乎很简单,但考虑到所有documentation
我可以理解,没有人帮助我实现类似 isSingletonObject(name: String): Boolean 的东西,如:
import scala.reflect.runtime.{universe => ru}
val rm = ru.runtimeMirror(classLoader)
def getInstance[T](name: String)(implicit tt: ru.TypeTag[T]): T = {
if (!isSingletonObject(name)) throw new RuntimeException(
s"$name does not specify a singleton object")
val moduleSym = try rm.staticModule(name).asModule
if (!(moduleSym.moduleClass.asClass.selfType <:< tt.tpe))
throw new RuntimeException("Type of loaded module " + moduleSym.fullName
+ " does not satisfy subtype relationship with "
+ tt.tpe.typeSymbol.fullName)
val mm = rm.reflectModule(moduleSym.asModule)
mm.instance.asInstanceOf[T]
}
如何找到对象并验证给定名称是否真的是对象? 也欢迎给定场景的替代方法。
【问题讨论】:
标签: scala reflection