如何在scala中获取类类型的字段?

时间:2013-07-14 08:53:54

标签: scala reflection

我正在尝试编写一个函数,它返回一个包含字段和类类型的地图。

函数调用类似于

val map: Map[String, Any] = getFields(classOf[User])

,功能如下:

def getFields[A](cls: Class[A]): Map[String, Any] = {
    var map: Map[String, Any] = Map()
    for (field <- classOf[cls].getDeclaredFields()) {
        field.getName match {
            case "id" => {}
            case _ => map += (field.getName() -> field.getType)
        }
    }
    println(map)
    map
}

,但我在classOf[cls] (未找到:输入cls)时收到错误消息。我怎样才能获得这样一个类的字段?另外,作为返回类型,当我想在之后匹配字段类型时,是否有比Map[String, Any]更好的解决方案?

2 个答案:

答案 0 :(得分:4)

cls已经是Class,无需在其上调用classOf

顺便说一下,你的代码可以写得更短:

cls.getDeclaredFields.filter(_.getName != "id").map(f => f.getName -> f.getType).toMap[String, Any]

不,不可能获得比Any更通用的类型,因为您的字段可能有完全不同的类型。

答案 1 :(得分:0)

使用反射&amp; ClassTag&amp; @sschaef较短版本:

import scala.reflect._

def getFieldsOf[A: ClassTag ](): Map[String, Any] = {
    val cls = classTag[A].runtimeClass
    cls.getDeclaredFields.filter(_.getName != "id")
                         .map(f => f.getName -> f.getType)
                         .toMap[String, Any]
}

在没有任何参数的情况下调用上面的函数 - 只有类名 - 使其更直观。

var map: Map[String, Any] = getFieldsOf[User]
println (map)