1

我正在尝试编写一个函数,该函数返回一个包含类的字段和类型的映射。

函数调用就像

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] (not found: type cls)处遇到错误。我怎样才能得到这样的类的字段?Map[String, Any]另外,作为返回类型,当我想在之后匹配字段类型时,是否有比 , 更好的解决方案?

4

2 回答 2

4

cls已经是一个Class,无需调用classOf它。

顺便说一句,您的代码可以写得更短:

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

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

于 2013-07-14T09:46:21.133 回答
0

使用反射 & ClassTag & @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)
于 2017-07-03T16:54:35.180 回答