Примеры применения рефлексии на основе позднего связывания
Данная тема есть продолжением следующих тем:
- Рефлексия типов. Получение метаданных типа. Пространство имен System.Reflection. Класс System.Type. Способы получения информации о типе. Оператор typeof
- Позднее связывание. Вызов метода. Клас System.Activator. Метод Invoke()
Содержание
- 1. Примеры применения рефлексии на основе механизма позднего связывания
- 2. Позднее связывание. Пример получения некоторого объекта из сети и его использование. Рисунок
- 3. Позднее связывание. Пример включения типов из другой сборки. Рисунок
- Связанные темы
Поиск на других ресурсах:
1. Примеры применения рефлексии на основе механизма позднего связывания
Как известно, основное преимущество рефлексии заключается в возможности инспектировать объект, информация о котором была неизвестна на этапе компиляции. Это реализуется благодаря позднему связыванию. Ниже приведены несколько примеров применения рефлексии.
- Пусть в программе возникла ситуация, когда получен объект с внешнего носителя, не находящегося в пространстве имен нашей программы. Такой объект может быть получен в виде последовательности байт из некоторого сетевого соединения. Известно только, что этот объект является классом. Возникает задача определить составляющие этого класса, затем на основе этих составляющих сформировать экземпляр класса и запустить необходимые методы.
- Рефлексия эффективна в компонентном программировании в системах быстрой разработки приложений (RAD — Rapid Application Development). В таких системах компоненты, которые добавляются в программу или форму представлены в виде пиктограмм, значков и тому подобное. По размещенному компоненту подгружается соответствующий программный код, формирующий функционал этого компонента. С помощью рефлексии можно динамически во время выполнения программы добавить этот функционал.
- Возможность создания и использования объектов на удаленных платформах. Такая возможность называется удаленный вызов методов (Remote Method Invocation, RMI). Объекты распределяются по нескольким компьютерам. Компьютер, использующий удаленный объект, использует этот объект путем рефлексии.
- Почти все современные фреймворки .NET работают на основе рефлексии.
- Сама утилита ildasm.exe подгружает сборку, определяет в ней методы, их параметры и тому подобное. Для определения метаданных сборки утилита использует рефлексию.
- С помощью рефлексии программа может изменять свою структуру добавляя к ее функционалу дополнительные модули.
- Рефлексия широко применяется в .NET для получения информации об атрибутах классов. Например, возможна ситуация, когда нужно определить, поддерживает ли объект некоторого класса сериализацию/десериализацию. Для этого определяется наличие (отсутствие) в классе атрибута Serializable.
- В современных системах визуальной разработки приложений существует поддержка их модификации путем добавления новых компонентов. Например, в системе программирования Delphi есть возможность разработать собственный компонент, сформировать этот компонент в объектный модуль (*.DCL то же что и *.DLL) и добавить этот компонент в палитру компонент Delphi. Система с помощью рефлексии определит типы, названия типов, составляющие этих типов, которые используются в компоненте. После закрытия и последующего запуска системы визуальной разработки приложений Delphi этот компонент уже будет подгружаться автоматически, поскольку информация о нем будет сохранена в файлах конфигурации Delphi.
⇑
2. Позднее связывание. Пример получения некоторого объекта из сети и его использование. Рисунок
На рисунке 1 изображена одна из особенностей рефлексии, которая определяет внутренний состав объекта на основе механизма позднего связывания.
Пусть при выполнении программы, из внешней среды было получено некоторый объект SomeObject. Информация о содержимом объекта неизвестна. Благодаря использованию рефлексии существует возможность:
- получить исключительную информацию о типах, реализованных в объекте;
- запустить на выполнение методы объекта.
Рисунок 1. Инспектирование объекта с помощью рефлексии
⇑
3. Позднее связывание. Пример включения типов из другой сборки. Рисунок
С помощью механизма позднего связывания можно определять составляющие других сборок. На рисунке 2 изображен пример получения данных из другой сборки. Пусть задано некоторое файловое хранилище, которое содержит некотору сборку с именем SomeAssembly.dll. Содержание сборки неизвестно. Благодаря рефлексии удается определить внутреннее содержание сборки и добавить ее в программу: типы (классы, интерфейсы, структуры и т.п.) и элементы в этих типах (методы, свойства, внутренние поля и т.д.).
Рисунок 2. Подключение внешней сборки к основной программе с помощью рефлексии
⇑
Связанные темы
- Рефлексия типов. Получение метаданных типа. Пространство имен System.Reflection. Класс System.Type. Способы получения информации о типе. Оператор typeof
- Позднее связывание. Вызов метода. Класс System.Activator. Метод Invoke()
⇑