首页 > 解决方案 > 如何调用特征的所有子类的成员方法?

问题描述

我已经设法使用 knownDirectSubclasses() 和 scala-reflect 列出给定特征的所有子类。我不确定如何将其转换为对象的实例。

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)
})

在上面的示例中,我想调用子对象的成员方法,而不是 x.toString()。

标签: scalareflection

解决方案


如果您的子类是objects,那么您可以像这样检索实例:

// 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])

推荐阅读