加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:54:04 所属栏目:安全 来源:网络整理
导读:我有一个像这样的对象: sealed trait Messageobject Message { case class DoSomething(...) extends Message case class DoSomethingElse(...) extends Message ...} 我要做的是创建Message对象中所有Messages的列表. 到目前为止我所拥有的是: val messag
我有一个像这样的对象:

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: class DoSomething is a static class,use reflectClass on a RuntimeMirror to obtain its ClassMirror

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

解决方法

在阅读了有关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]]
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读