最近在看sparksql源码的时候,发现TreeNode是继承scala的Product特质,所以比较好奇,就找了相关资料,通过编写demo,进行理解Product的具体用法。
case class ProductDemo(x:String ,y:String, z:Integer) extends Product {
}
object ProductDemo {
def main(args: Array[String]): Unit = {
val planExample = ProductDemo("a", "b",100)
println(planExample.productArity)
println(planExample.productElement(0))
println(planExample.productPrefix)
println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
val iterator = planExample.productIterator
while (iterator.hasNext) {
println(iterator.next().toString )
}
println(planExample.productElementName(1))
println("*****************************")
val names = planExample.productElementNames
while (names.hasNext) {
println(names.next())
}
}
}
运行结果为:
3
a
ProductDemo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a
b
100
y
*****************************
x
y
z
个人理解:
从上面的demo可以很容易发现,调用product的相关方法可以获得其子类case class定义的字段名称,字段数量,以及其子类的具体实现类对应的字段赋的具体值。感觉功能上是有点像java通过反射获取具体对象或者类的属性。