Подтвердить что ты не робот

Какие возможности отражения можно ожидать от Scala 2.10?

Scala 2.10 отображает отражение, отличное от того, которое предоставило JVM (или я полагаю, CLR).

В чем, в частности, мы должны рассчитывать и как это будет улучшаться на платформе?

Например, будет ли класс, который отражает конвертируемость языка между полями и методами доступа, чтобы я мог выполнять итерацию по свойствам объекта?

4b9b3361

Ответ 1

обновление 2012-07-04:

Daniel SOBRAL (также на SO) подробнее в своем блоге " Сериализация JSON с отражением в Scala! Часть 1 - Итак, вы хотите сделать отражение?" некоторые функции, возникающие с отражением:

Чтобы повторить, Scala 2.10 придет с библиотекой отражения Scala.
Эта библиотека используется самим компилятором, но разделена на слои через шаблон торта, поэтому разные пользователи видят различные уровни детализации, сохраняя jar размеры, адекватные каждому из них, и, надеюсь, скрывающие нежелательные детали.

Библиотека отражения также интегрируется с предстоящими макрообъектами, что позволяет инициативным кодам манипулировать кодом во время компиляции.


обновление 2012-06-14. (из Евгений Бурмако):
В Scala 2.10.0-M4 мы выпустили новый API отражения который, скорее всего, превратится в 2.10.0-final без значительных изменений.
Более подробную информацию об API можно найти:

Экстракты:

Вселенные и зеркала теперь являются отдельными объектами:

  • все предметы артефактов отражения объектов (деревья, символы, типы и т.д.),
  • зеркалирует абстрактную загрузку этих артефактов (например, JavaMirror загружает материал используя загрузчик классов и аннотацию, в то время как GlobalMirror использует внутренний компилятор classreader для достижения той же цели).

API общедоступного отражения разделяется на scala.reflect.base и scala.reflect.api.

  • Первый представляет собой минималистский снимок, который достаточно для того, чтобы строить деревья и типы деревьев.
  • Чтобы построить, но не анализировать - все умное (например, получение сигнатуры типа) реализовано в scala.reflect.api.

Обе области отражения имеют свою собственную вселенную: scala.reflect.basis и scala.reflect.runtime.universe.

  • Первый суперлегкий и не содержит никаких загрузчиков классов,
  • в то время как последний представляет собой сжатый компилятор.

Первоначальный ответ, сентябрь 2011 года:

Вы можете увидеть эволюцию пакета отражения в Scala GitHub repo с двумя последними фиксациями:

(Подпись Liftcode, согласно этот поток, направлена ​​на упрощение "написания кода, который пишет код" )

Класс scala/reflect/internal/Importers.scala (создан вчера!) - хороший пример использования последней функции отражения.

Ответ 2

Две ссылки, которые должны представлять интерес:

Лично я надеюсь использовать это для выполнения открытий во время выполнения расширений (т.е. типа, который расширяет известный признак) и создания форм пользовательского интерфейса и нескольких других вещей из них.

Ответ 3

С текущим 2.10M4 вы уже можете перебирать элементы класса:

reflect.runtime.universe.typeOf[MyClass].members.filter(!_.isMethod)

В приведенном выше коде перечислены Symbol объекты, представляющие члены класса MyClass, которые не являются методами. Есть тонны способов, которые вы можете точно настроить.