如何在scala中获取classtype的字段



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

函数调用类似

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]更好的解决方案吗?

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

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

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

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

使用反射&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)

相关内容

  • 没有找到相关文章

最新更新