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 用途にはいいかも