使用反射列出对象中的所有类

4

我有一个对象,像这样:

sealed trait Message
object Message {
  case class DoSomething(...) extends Message
  case class DoSomethingElse(...) extends Message
  ...
}

我将尝试创建一个 Message 对象中所有消息的列表。目前我所拥有的是:
val messages: Iterable[Class[_ <: Message]] = {
  import scala.reflect.runtime.universe._
  val mirror = runtimeMirror(this.getClass.getClassLoader).reflect(Message)
  typeOf[Message.type].decls.collect {
    case c: ClassSymbol if c.toType <:< typeOf[Message] =>
      mirror.reflectClass(c).symbol.getClass.asInstanceOf[Class[_ <: Message]]
  }
}

但是对我来说,它并没有提供非常有用的错误信息:

scala.ScalaReflectionException: class DoSomething is a static class, use reflectClass on a RuntimeMirror to obtain its ClassMirror

据我所见,我正在使用RuntimeMirror上的reflectClass。我错过了什么吗? 谢谢


只是猜测:也许是 toType 引起了这个问题,你需要改成 c.reflectClass.toType <:< typeOf[Message] - lmm
啊,我的错。我忘了提到我在这里得到了错误 mirror.reflectClass(c),所以我猜不是 toType 的问题。 - gysyky
1个回答

9

在深入学习Scala反射之后,我获得了更多的知识并找到了解决方案。我所需要的只是:

val messages = {
  import scala.reflect.runtime.universe._
  val mirror = runtimeMirror(this.getClass.getClassLoader)
  typeOf[Message.type].decls.collect {
    case c: ClassSymbol if c.toType <:< typeOf[Message] =>
      mirror.runtimeClass(c).asInstanceOf[Class[_ <: Message]]
  }
}

+1 回复自己并不让这个问题无人回答,顺便说一句,这对我也有用。 - giampaolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接