В чем разница между зеркальным отражением и традиционным отражением?

В некоторых языках, таких как Dart, используется зеркальное отражение, поэтому, в простых терминах, в чем разница между такой реализацией и традиционным отражением, как вы видите в C# или Java.

Обновление: я нашел это превосходное (и несколько странное) видео Гилада Брача о отражении в зеркале в Newspeak. http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (зеркальное отображение начинается в 7:42)

3 ответа

Решение

Я не думаю, что для многих целей зеркала будут отличаться от отражения Java. Самое важное, что нужно знать о зеркалах, это то, что они отделяют API отражения от стандартного API объекта, поэтому вместо obj.getClass() вы используете отражение (obj). Это, казалось бы, небольшая разница, но она дает вам несколько приятных вещей:

  1. API объекта не загрязнен, и нет опасности сломать отражение, переопределив метод отражения.
  2. У вас могут быть разные зеркальные системы. Скажем, тот, который не разрешает доступ к закрытым методам. Это может оказаться очень полезным для инструментов.
  3. Зеркальная система не должна быть включена. Для компиляции в JS это может быть важно. Если зеркала не используются, то нет никакого внеполосного доступа к коду, и обрезка становится жизнеспособной.
  4. Зеркала могут работать для удаленного кода, а не только для локального кода, так как вам не нужно, чтобы отраженный объект находился в том же изоляторе или виртуальной машине, что и зеркало.

Вот как зеркала отличаются от отражения в Java и Javascript, когда используются для получения методов объекта:

Джава:

myObject.getClass().getMethods(); // returns an array

Dart:

reflect(myObject).type.methods; // returns a map

Javascript:

var methods = [];
for (var m in myObject) {
  if (typeof m === 'function') {
    methods.push(m);
  }
}

Ваша лучшая ставка - эта статья Гилада Брача, со-дизайнера Дарт и автора спецификаций. Чтобы получить представление, вероятно, будет достаточно прочитать первую главу.

Аннотация утверждает, что зеркала придерживаются трех необходимых принципов, которые не сопровождаются традиционными размышлениями:

Мы определили три принципа проектирования средств отражения и метапрограммирования в объектно-ориентированных языках программирования. Инкапсуляция: средства мета-уровня должны инкапсулировать их реализацию. Стратификация: средства мета-уровня должны быть отделены от функциональности базового уровня. Онтологическое соответствие: онтология метауровневых средств должна соответствовать онтологии языка, которым они манипулируют. Традиционные / основные отражающие архитектуры не следуют этим правилам. Напротив, отражающие API, построенные вокруг концепции зеркал, характеризуются приверженностью этим трем принципам.

Я также хотел бы указать вам на этот другой недавний ответ Гилада, где он перечисляет другой замечательный справочный материал: как получить конкретный объект статического метода через зеркальный API?

Другие вопросы по тегам