Scala 如何调用trait的所有子类的成员方法?

Scala 如何调用trait的所有子类的成员方法?,scala,reflection,Scala,Reflection,我使用带有scala reflect的KnownDirectSubclass()列出了给定特征的所有子类。我不知道如何将其转换为对象的实例 import scala.reflect.runtime.{universe => ru} sealed trait Parent extends Product { def toPrint: String = { getClass.getSimpleName() + "!!!" } } object UmbrellaObj {

我使用带有scala reflect的KnownDirectSubclass()列出了给定特征的所有子类。我不知道如何将其转换为对象的实例

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()。

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

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

Scala中的反射是最后的手段。通常有更好的方法来实现你需要做的事情。您可能希望给出一些上下文,这是关于什么的。至于手头的问题:您只能通过调用构造函数来创建类的实例。需要什么样的参数完全取决于所讨论的类。此外,这些类中的一些可能是抽象的,然后根本不能(直接)实例。考虑使用像Enumeratum这样的库: