scala - 判断一个案例类的字段是否为案例类
问题描述
我试图弄清楚任何给定案例类中的成员字段是否也是案例类。从这个答案中,给定一个实例或一个对象,我可以将它传递并确定它是否是一个案例类:
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
}
但是,我想要的是获取一个案例类,提取其所有成员字段,并找出哪些是案例类本身。以这种方式:
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
}
我想也许我可以提取字段、它们的类,并使用反射将该成员字段的新实例实例化为它自己的类。我不是 100% 如何做到这一点,而且似乎有更简单的方法。有没有?
解决方案
啊! 我已经想通了(简化了判断的函数):
import reflect.runtime.universe._
case class MyThing(str:String, num:Int)
case class WithMyThing(name:String, aThing:MyThing)
val childThing = MyThing("Neat" , 293923)
val parentCaseClass = WithMyThing("Nate", childThing)
def isCaseClass(v: Any): Boolean = {
val typeMirror = runtimeMirror(v.getClass.getClassLoader)
val instanceMirror = typeMirror.reflect(v)
val symbol = instanceMirror.symbol
symbol.isCaseClass
}
def innerCaseClasses[A](parentCaseClass:A): Unit = {
val fields = parentCaseClass.asInstanceOf[Product].productIterator
fields.foreach(field => {
println(s"Field: ${field.getClass.getSimpleName} isCaseClass? " + isCaseClass(field))
})
}
innerCaseClasses(parentCaseClass)
打印:
字段:字符串 isCaseClass?错误的
字段:MyThing isCaseClass?真的
推荐阅读
- javafx-8 - 如何用Java创建天球
- amazon-web-services - Amazon Serverless Application Model (SAM) 有条件地包含在模板中
- regex - 正则表达式 - 接受基本拉丁语中的字符,除了一个
- xgboost - SageMaker XGBoost 超参数调优与 XGBoost python 包
- python - Py2PDF PdfFileWriter - 拆分 PDF 是附加文件而不是保存自己的文件
- docker - Redis 在 minikube 中不使用配置文件
- powershell - 使用 ARM 模板和 DSC 部署 Azure VM 和用户
- ios - 如何通过 Xcode 在我的应用程序中使用 San Francisco Pro 字体?
- r - 为什么裁剪栅格堆栈会更改图层名称?
- google-sheets - 在谷歌电子表格中减去两列