如何调用特征的所有子类的成员方法?

时间:2019-11-20 12:11:08

标签: scala reflection

我已经成功地使用带有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()。

1 个答案:

答案 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])