我正在尝试编写一个函数,它返回一个包含字段和类类型的地图。
函数调用类似于
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]
更好的解决方案?
答案 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)