首页 > 解决方案 > 如何使用 Scala 反射来查找特征的所有子类(不使用第三方工具)?

问题描述

假设我有一个类型,结果:

trait Result[+T] {

  def getValue: T

}

以及该特征的子类型 AnyValResult:

class AnyValResult(value: AnyVal) extends Result[AnyVal] {
  override def getValue: AnyVal = value
}

我希望能够向 Scala 的反射库询问 Result[_] 类型的所有子类型,并让它返回一个包含 AnyValResult 的集合。

我见过很多人问这个问题,他们似乎都说他们是使用第三方工具完成的。这是几年前的事了。除了对第三方工具进行逆向工程之外,有没有一种方法可以在最近版本的 Scala 中引入?如果我可以直接通过反射来完成,我宁愿不必在 Github 上引用一些随机项目。

标签: scalareflection

解决方案


子类可以在运行时动态加载/创建(如果特征未密封),因此通常不能直接使用 Java 或 Scala 反射来完成。这不是 Scala 版本有多新的问题,而是 JVM 的工作方式。您应该加载每个类并检查该类是否扩展了特征。

如何在 Java 中找到给定类的所有子类?

是否可以获得一个类的所有子类?


推荐阅读