我正在尝试编写一个函数,它返回一个包含字段和类类型的映射。
函数调用类似
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)