我有三个班级
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
}
答案 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"