scala - 如何调用一个trait的所有子类的成员方法?

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

最佳答案

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

// 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 - 如何调用一个trait的所有子类的成员方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58954062/

相关文章:

Scala 惰性并行集合(可能吗?)

java - Java中如何使用反射获取注解的值

java - 如何使用反射提取某个类型的所有属性?

scala - Scala 中可变长度参数列表的类型是什么?

c# - 在 C# 中将 DataTable 转换为 List<T>

java - 方法作为带有签名合约的参数?

java - ExceptionInInitializerError : code size limit exceeded when loading a DLL in JNA

java - 如何检查集合是否包含 Scala 中其他集合的任何元素?

scala - 类 'SessionTrigger' 必须声明为抽象或实现抽象成员

scala - 在 Spark 中,我无法按现有列进行过滤