2013-07-14 3 views
1

Я пытаюсь написать функцию, которая возвращает карту с полями и типами класса.Как получить поля classtype в scala?

Вызов функции, как

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](не найден: тип ЦБС). Как я могу получить поля такого класса? Кроме того, в качестве возвращаемого типа существует ли лучшее решение, чем Map[String, Any], когда я хочу соответствовать типу field after?

ответ

4

cls уже есть Class, не нужно звонить classOf на нем.

Btw, ваш код может быть написан гораздо короче:

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

И нет, это не представляется возможным получить более общий вид, чем Any, потому что ваши поля могут иметь совершенно разные типы.

+0

Ох человек ... определенно думал, что трудно. Спасибо! – 3x14159265

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) 
Смежные вопросы