Magnolia Tech

いつもコードのことばかり考えている人のために。

コンストラクタメソッドからオブジェクトを動的に生成する

一つ前のエントリの続き

次はcase classではなく、普通のクラスを生成する

import scala.reflect.runtime.{universe => ru}
import ru._

class Person(val name: String)

object ReflectionTest {
  def main(args: Array[String]): Unit = {


    def generate[T](implicit tag: TypeTag[T]): T = {

      val typeSymbol          = typeOf[T].typeSymbol            // 型のSymbolを得る
      val constructorSymbol = typeSymbol.asClass.typeSignature.decl(termNames.CONSTRUCTOR).asMethod // コンストラクタ

      val mirror = scala.reflect.runtime.currentMirror            // 現在のミラーを取得する
      val cm = mirror.reflectClass(typeSymbol.asClass)            // Class Mirrorを得る

      val constrcutorMirror = cm.reflectConstructor(constructorSymbol)

      constrcutorMirror("John").asInstanceOf[T]  // 実行する
    }

    println(generate[Person].name) // 生成したオブジェクトが得られる
  }
}