我已经成功地使用带有scala-reflect的knownDirectSubclasses()列出了给定特征的所有子类。我不确定如何将其转换为对象的实例。
import scala.reflect.runtime.{universe => ru}
sealed trait Parent extends Product {
def toPrint: String = {
getClass.getSimpleName() + "!!!"
}
}
object UmbrellaObj {
case object Child1 extends Parent {}
case object Child2 extends Parent {}
implicit def toString(f: Parent): String = f.toPrint
}
val tpe = ru.typeOf[Parent]
val clazz = tpe.typeSymbol.asClass
println(UmbrellaObj.Child1.toString)
clazz.knownDirectSubclasses.foreach(x => {
println(x.toString)
})
在上面的示例中,我想调用Child对象的成员方法,而不是x.toString()。
答案 0 :(得分:1)
如果您的子类是object
,则可以检索如下实例:
// objects are 'module classes'
val modules = clazz.knownDirectSubclasses
.filter(_.isModuleClass).map(_.asClass.module.asModule)
val mirror = ru.runtimeMirror(getClass.getClassLoader)
val instances: Set[Parent] = modules.map(mirror.reflectModule)
.map(_.instance.asInstanceOf[Parent])