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

时间:2014-11-28 13:01:50

标签: scala reflection mirror

我有一个像这样的对象:

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

我要做的是创建Message对象中所有Messages的列表。

到目前为止我所拥有的是:

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:类DoSomething是一个静态类,在RuntimeMirror上使用reflectClass来获取其ClassMirror

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

1 个答案:

答案 0 :(得分: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]]
  }
}