Какие возможности отражения мы можем ожидать от Scala 2.10? - PullRequest
31 голосов
/ 20 сентября 2011

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

Что конкретно нам нужно ожидать и как это улучшится на платформе?

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

Ответы [ 3 ]

14 голосов
/ 22 сентября 2011

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

Даниэль СОБРАЛЬ (также на SO ) подробности в своем блоге "Сериализация JSON с отражением в Scala! Часть 1. Итак, вы хотите сделать отражение?"Некоторые функции, которые идут с отражением:

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

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


обновление 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 , с двумя последними коммитами:

(Lift-код, согласно этой теме , направлен на упрощение "написания кода, который пишет код")

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

11 голосов
/ 20 сентября 2011

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

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

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

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

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

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

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