gys*_*yky 4 reflection scala mirror
我有一个像这样的对象:
sealed trait Message
object Message {
case class DoSomething(...) extends Message
case class DoSomethingElse(...) extends Message
...
}
Run Code Online (Sandbox Code Playgroud)
我要做的是创建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]]
}
}
Run Code Online (Sandbox Code Playgroud)
但它对我来说产生的信息不是很多:
scala.ScalaReflectionException:类DoSomething是一个静态类,在RuntimeMirror上使用reflectClass来获取其ClassMirror
据我看到的,我使用reflectClass的RuntimeMirror.我错过了什么吗?谢谢
在阅读了有关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]]
}
}
Run Code Online (Sandbox Code Playgroud)