Отражение - это средство, где вы можете запросить объект об его атрибутах во время выполнения. Например, Python, Java и .Net имеют средства, где вы можете найти переменные экземпляра или методы объекта.
Примером приложения для отражения является слой отображения O / R. Некоторые используют отражение для конструирования объекта путем запроса его свойств во время выполнения и динамического заполнения экземпляра. Это позволяет вам делать это программно на основе метаданных из какого-либо словаря данных без перекомпиляции приложения.
Чтобы взять простой пример, я буду использовать Python, потому что его средства отражения очень просты в использовании и требуют меньше шаблонного, чем в java или .Net.
ActivePython 2.5.2.2 (ActiveState Software Inc.) based on
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class foo:
... def __init__(self):
... self.x = 1
...
>>> xx = foo() # Creates an object and runs the constructor
>>> xx.__dict__ # System metadata about the object
{'x': 1}
>>> a = xx.__dict__ # Now we manipulate the object through
>>> a['y'] = 2 # its metadata ...
>>> print xx.y # ... and suddenly it has a new instance variable
2
>>>
Теперь мы использовали базовое отражение, чтобы изучить переменные экземпляра произвольного объекта. Специальная переменная __dict__
в Python - это системное свойство объекта, в котором хеш-таблица его членов содержит имя переменной (или метода). Мы рефлекторно исследовали объект и использовали средства отражения, чтобы искусственно вставить в него вторую переменную экземпляра, которую мы затем можем отобразить, вызвав ее как переменную экземпляра.
Обратите внимание, что этот конкретный прием не работает на Java или .Net, поскольку переменные экземпляра являются фиксированными. Система типов этих языков не позволяет добавлять новые переменные экземпляра во время выполнения так, как это делает система ввода Python 'duck'. Однако вы могли бы рефлексивно обновить значение переменной экземпляра, которая была объявлена в определении типа.
Вы также можете использовать отражение, чтобы динамически создавать вызовы методов и выполнять различные другие хитрые приемы, такие как создание объекта на основе параметра. Например, если у вас была какая-то система на основе плагинов, в которой определенные возможности были необязательными, вы можете использовать отражение, чтобы запросить плагин о том, какие услуги он предлагает (возможно, путем запроса о том, были ли реализованы определенные интерфейсы), не требуя явных метаданных.
Многие динамические языковые интерфейсы, такие как OLE-автоматизация, используют отражение как неотъемлемую часть интерфейса.