Scala Class.getFields - PullRequest
       3

Scala Class.getFields

8 голосов
/ 10 октября 2011

Для целей моего приложения мне нужно иметь возможность найти список полей типа (не экземпляр) и типов этих полей во время выполнения.До сих пор я мог только получить список методов класса case, содержащих геттеры с classOf[MyCaseClass].getMethods и ничего полезного из простого класса.Я что-то пропустил?Существуют ли библиотеки отражений для таких целей?Как это сделано правильно?

Ответы [ 2 ]

17 голосов
/ 10 октября 2011

Использование Scala 2.10 отражения:

scala> import reflect.runtime.{universe => ru}
import reflect.runtime.{universe=>ru}
scala> trait A { val field1: Int; val field2: Char; def meth1: Int }
defined trait A
scala> val fieldSymbols = ru.typeOf[A].members.collect{ case m: ru.MethodSymbol if m.isGetter => m }
fieldSymbols: Iterable[reflect.runtime.universe.MethodSymbol] = List(value field2, value field1)

Возвращаемые символы содержат всю информацию о типе, например:

scala> fieldSymbols.map(_.typeSignature)
res16: Iterable[reflect.runtime.universe.Type] = List(=> scala.Char, => scala.Int)
6 голосов
/ 10 октября 2011

Возможно, вы захотите взглянуть на этот документ по отражению scala .getMethods - это метод из отражения Java.Что ты не можешь там найти?Из Javadoc :

  • String getName (): возвращает имя метода, представленного этим объектом метода, в виде строки.
  • Class [] getParameterTypes(): Возвращает массив объектов Class, которые представляют формальные типы параметров, в порядке объявления, метода, представленного этим объектом Method.
  • Class getReturnType (): Возвращает объект Class, который представляет формальный тип возвратаметода, представленного этим объектом метода.

Вы можете прочитать больше о Отражение Java .

Обратите внимание, что не вся информация о типах будет доступна во время выполнения, потому что стирание .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...