mercredi 25 juillet 2018

Determine if the field of a case class is a case class

I'm trying to figure out if a member field in any given case class is also a case class. Taken from this answer, given an instance or an object, I can pass it along and determine if it's a case class:

def isCaseClass(v: Any): Boolean = {
  import reflect.runtime.universe._
  val typeMirror = runtimeMirror(v.getClass.getClassLoader)
  val instanceMirror = typeMirror.reflect(v)
  val symbol = instanceMirror.symbol
  symbol.isCaseClass
}

However, what I'd like, is to take a case class, extract all of its member fields, and find out which ones are case classes themselves. Something in this manner:

 def innerCaseClasses[A](parentCaseClass:A): List[Class[_]] = {
  val nestedCaseClasses = ListBuffer[Class[_]]()
  val fields = parentCaseClass.getClass.getDeclaredFields
  fields.foreach(field =>  {
    if (??? /*field is case class */ ) {
      nestedCaseClasses += field.getType
    }
  })
  nestedCaseClasses.toList
} 

I thought maybe I could extract the fields, their classes, and use reflection to instantiate a new instance of that member field as its own class. I'm not 100% how to do that, and it seems like perhaps there's an easier way. Is there?





Aucun commentaire:

Enregistrer un commentaire