Scala で Reflection を使ってみた

適当なインスタンスから JSON 文字列を出力したいなーと思い、折角なので Refrection を使ってやってみた。

reflection

Scala(Java?) での Reflection は obj.getClass でクラス情報を取得するところから。
取得したクラスに対して getDeclaredFields, getDeclaredMethods を呼び出すことでメンバの情報が取れるので、後はお好きなように。
取得した method は invoke で呼び出せる。

できたもの

abstract class Dumpable
{
  def dumpMap(): Map[String, Any] =
    {
      val cls = this.getClass
      
      cls.getDeclaredFields.map(_.getName).map(
        x=>(x, cls.getDeclaredMethod(x).invoke(this))).toMap
    }
}

自分のメンバを全部 Map として dump するメソッドを持ったクラスを定義した。
とりあえず Map になってくれればあとはどうとでもなるので、これでよし。

case class でこのクラスを継承することを前提に作ったのだけども、 case class の field は全部 private なのでそのままでは取得できない。
field と同名の getter があるのでそちらを呼ぶ必要がある。

使い方

使うときは Dumpable を継承した case class を作り、そのクラスで dumpMap を呼ぶだけ。

case class Object(x: Int = 10,
                  y: String = "test",
                  z: String = "aaa",
                  w: List[String] = List("aaa", "bbb", "ccc")) extends Dumpable
{
}

println(Object().dumpMap) # => Map(x -> 10, y -> test, z -> aaa, w -> List(aaa, bbb, ccc))

まとめ

  • Reflection 簡単
  • 一方通行の Serialize 用途にはいいかも