В чем разница между зеркальным отражением и традиционным отражением?
Некоторые языки, такие как Dart, используют зеркальное отражение, поэтому, в простых терминах, в чем разница между такой реализацией и традиционным отражением, как вы видите на С# или Java.
Обновление:
Я нашел это превосходное (и несколько причудливое) видео Гилада Брахи на зеркальном отражении в Newspeak.
http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (материал зеркала начинается в 7:42)
Ответы
Ответ 1
Для многих применений я не думаю, что зеркала будут отличаться от отражения Java. Самое главное, что касается зеркал, заключается в том, что они отделяют API отражения от стандартного API объекта, поэтому вместо obj.getClass() вы используете отражение (obj). Это, казалось бы, небольшая разница, но это дает вам несколько приятных вещей:
- API-интерфейс объекта не загрязнен, и нет опасности нарушения отражения путем переопределения отражающего метода.
- У вас могут быть разные зеркальные системы. Скажем, тот, который не разрешает доступ к закрытым методам. Это может оказаться очень полезным для инструментов.
- Зеркальная система не обязательно должна быть включена. Для компиляции в JS это может быть важно. Если зеркала не используются, тогда нет доступа к коду вне зоны доступа, и обрезка становится жизнеспособной.
- Зеркала могут быть созданы для работы с удаленным кодом, а не только с локальным кодом, так как вам не нужно, чтобы отраженный объект находился в том же изоляте или VM, что и зеркало.
Здесь, как зеркала отличаются от отражения в Java и Javascript при использовании методов объекта:
Java:
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);
}
}
Ответ 2
Лучше всего в этой статье Гилада Брача, соавтора и автора спецификации Дарта. Чтобы получить представление, этого, вероятно, будет достаточно, чтобы прочитать первую главу.
Абстрактные утверждения, что зеркала придерживаются трех необходимых принципов, за которыми не следует традиционное отражение:
Мы идентифицируем три принципа проектирования для отражения и метапрограммирования объектов в объектно-ориентированных языках программирования. Инкапсуляция:метауровневые объекты должны инкапсулировать их реализацию. Стратификация: объекты метауровня должны быть отделены от функциональность базового уровня. Онтологическое соответствие: онтология метауровневые объекты должны соответствовать онтологии язык, которым они манипулируют. Традиционный/основной рефлексивный архитектуры не следуют этим предписаниям. Напротив, отражающий API, построенный вокруг концепции зеркал, характеризуется соблюдение этих трех принципов.
Ответ 3
Я также хотел бы указать на этот другой недавний ответ Гилада, в котором он перечисляет некоторые другие полезные справочные материалы: Как получить конкретный объект статического метода через зеркальный API?