鍍金池/ 問答/Java  Scala  網絡安全/ Scala如何獲得所有繼承trait的子對象

Scala如何獲得所有繼承trait的子對象

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 分發(fā)從 akka actor 獲取到的 event 到 Base 各自子對象中
}
  • 當使用 akka 拋出 Event 事件時,我希望通知所有繼承了特質 Base 的對象ABC,它們各自再對事件進行各自的操作。
  • 現(xiàn)在想要的效果是 akka 拋出的事件由 Base 的伴生對象統(tǒng)一分發(fā)處理,同時驗證繼承 Base 的是否都是 object 單例。
回答
編輯回答
孤影

這里需要用到反射機制:使用 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$.class。Base$.class 類中有一個常量字段 MODULE$,它的類型就是當前類 Test$ 的類類型。

2018年4月9日 22:30