我有一个像这样的对象:
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
。我错过了什么吗?
谢谢
答案 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]]
}
}