Это не обман, но, как и любой инструмент, его следует использовать для решения своих задач. Отражение по определению позволяет вам проверять и модифицировать код с помощью кода; если это то, что вам нужно сделать, то отражение - это инструмент для работы. Отражение - это все о метакоде: коде, который нацелен на код (в отличие от обычного кода, нацеленного на данные).
Примером правильного использования отражения являются универсальные классы интерфейса веб-службы. Типичный дизайн состоит в том, чтобы отделить реализацию протокола от функциональных возможностей полезной нагрузки. Итак, у вас есть один класс (давайте назовем его T
), который реализует вашу полезную нагрузку, и другой, который реализует протокол ( P
). T
это довольно просто: для каждого вызова, который вы хотите сделать, просто напишите один метод, который делает то, что должен делать. P
однако необходимо сопоставить вызовы веб-службы вызовам метода. Делать это отображение универсальным желательно, потому что оно избегает избыточности и делает его P
многократно используемым. Reflection предоставляет средства для проверки класса T
во время выполнения и вызова его методов на основе строк, передаваемых P
через протокол веб-службы, без каких-либо знаний класса во время компиляцииT
, Используя правило «код о коде», можно утверждать, что у класса P
есть код в классе T
как часть его данных.
Тем не мение.
Reflection также предоставляет вам инструменты, позволяющие обойти ограничения системы типов языка - теоретически вы можете передавать все параметры как типы object
и вызывать их методы посредством отражений. Вуаля, язык, который должен обеспечивать строгую дисциплину статической типизации, теперь ведет себя как динамически типизированный язык с поздним связыванием, только синтаксис гораздо более сложный. Каждый отдельный пример такого паттерна, который я видел до сих пор, был грязным взломом, и неизменно было бы возможным решение в системе типов языка, и оно было бы более безопасным, более элегантным и более эффективным во всех отношениях. ,
Существует несколько исключений, таких как элементы управления графическим интерфейсом, которые могут быть привязаны к данным к различным не связанным типам источников данных; требовать, чтобы ваши данные реализовывали определенный интерфейс только для того, чтобы вы могли связывать данные, это нереально, и программист не должен реализовывать адаптер для каждого типа источника данных. В этом случае использование отражения для определения типа источника данных и настройка привязки данных является более полезным выбором.