为了账号安全,请及时绑定邮箱和手机立即绑定

Scala如何获得所有继承trait的子对象

Scala如何获得所有继承trait的子对象

GCT1015 2019-01-18 00:12:03
trait Base object A extends Base // 正常,处理事件 object B extends Base // 正常,处理事件 object C extends Base // 正常,处理事件 class D extents Base // 异常 object Base { //TODO 验证继承 trait Base 的是否都是 object,不是则抛异常 //TODO 分发从 akka actor 获取到的 event 到 Base 各自子对象中 } 当使用 akka 抛出 Event 事件时,我希望通知所有继承了特质 Base 的对象ABC,它们各自再对事件进行各自的操作。 现在想要的效果是 akka 抛出的事件由 Base 的伴生对象统一分发处理,同时验证继承 Base 的是否都是 object 单例。
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

这里需要用到反射机制:使用 Java 类库 reflections 里的 getSubTypesOf 获取所有子类,但想获得其对应的对象需要通过 getField 获得 MODULE$ 字段,根据该字段就可以获得对应的对象。

package com.gcusky.util.reflect

import org.reflections.Reflections
import scala.collection.JavaConverters._

object Base {
  def subObject[T](underlying: Class[T]): Seq[T] = {
    val reflects = new Reflections("com.gcusky.util.reflect")
    reflects.getSubTypesOf(underlying).asScala.map { sub =>
      sub.getField("MODULE$").get(null).asInstanceOf[T]
    }.toSeq
  }
}

因为在Scala中,单例对象和伴生对象编译完后会生成两个class文件:Base.classBase$.classBase$.class 类中有一个常量字段 MODULE$,它的类型就是当前类 Test$ 的类类型。

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 581 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号