从Scala中的子类获取所有字段值

时间:2016-03-16 17:00:12

标签: scala

我有三个班级

class A (
  param1:Int,
  param2:Int
)

class B (
  param3:Int,
  param4:Int
)

class C(
 param1:A,
 param2:B
)

我需要在字段名称到对象之间进行映射,例如

param1->1
param2->2
param3->3
param4->4

所以我厌倦了如下所示,但不是产品类型

  def func1(c: C): Map[String, Object] = {
    var map = Map[String, Object]()
    for (field <- c.getClass.getDeclaredFields) yield {
      map ++ getFieldMap(field))
    }
  }

  def getFieldMap(p: Product): Map[String, Object] = {
    var values = p.productIterator
    p.getClass.getDeclaredFields.map(_.getName -> {
      values.next.asInstanceOf[AnyRef] 
    }).toMap
  }

2 个答案:

答案 0 :(得分:1)

您的代码存在多个问题。 <identity impersonate="true"/>class A未实现class B特征。您必须手动执行Product并实现所有方法,或者将它们声明为with Product类。

case

要确保Scala实际为构造函数参数生成字段,请在前面添加case class A ( val param1: Int, val param2: Int ) case class B ( val param3: Int, val param4: Int ) 关键字。

此外,您传递的是字段val),而不是它的值,您必须先获取该值。

java.lang.reflect.Field

答案 1 :(得分:1)

如果你可以创建你的类案例类,你可以使用无形:

import shapeless._
import shapeless.record._
case class A (param1:Int, param2:Int)

val a = A(12, 34)

val AGen = LabelledGeneric[A]
val map = AGen.to(a).toMap.map { case (k, v) => (k.name, v) }

println(map("param1")) // prints "12"