scala - 如何调用特征的所有子类的成员方法?
问题描述
我已经设法使用 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()。
解决方案
如果您的子类是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])
推荐阅读
- jenkins - 有什么方法可以将我的本地主机 Jenkins 托管到公共 IP
- android-studio - 为什么webview不支持打电话?我已经加载了谷歌搜索页面并试图从该搜索结果中调用,但它给出了错误
- c# - Listview SelectedItem 不绑定
- selenium - 如何在 xpath 中指定父级的索引?
- flutter - 如何在颤振中使用标头调用 get API?任何想法?
- python - 如何使用第一行的值对列进行拆分排序?
- sql - 显示每个部门的重复成绩与部门名称和他们的成绩
- java - 让数组存储用户输入,然后打印最大值
- php - 如何在控制器 laravel 的一列中保存多个输入
- c# - 如何通过浏览器发布/访问 C# 桌面应用程序?