Java. Основы рефлексии.

Мы часто сталкиваемся с проблемами, которые могут быть решены легко и элегантно с использованием рефлексии (reflection).
Рассмотрим следующие сценарии:
- Ваш менеджер вкомитил подключаемый фреймворк с расчетом, что система принимает новые компоненты даже после того, как она была собрана и развернута. Вы создаете некоторые интерфейсы и подготавливаете механизм для патча jar-файлов понимая, что это все не удовлетворит нужд для подключения.
- После долгих месяцев разработки клиентского приложения, отдел маркетинга говорит вам, что использование другого удаленного механизма увеличит продажи. Теперь вам необходимо переписать удаленные интерфейсы.
- API вашего модуля должно принимать вызовы только от определенных пакетов, чтобы обезопасить модуль от вызова другими пакетами. Вы добавляете параметр в каждый из вызовов, который будет хранить имя пакета вызывающего класса. Но, теперь "легальные" пользователи должны менять их вызовы, а любой другой недружелюбный код может подделать имя пакета.
Эти три сценария иллюстрируют модульность, удаленный доступ и безопасность. На первый взгляд кажется, что они не имеют ничего общего. Но это не так. Каждый из них содержит изменения в требованиях, которые могут быть удовлетворены только путем изменения кода программы. Переопределение интерфейсов, патчинг jar-файлов и модификация вызовов методов - весьма скучные и механические задания. С использованием рефлексии, можно отойти от вышеуказанных действий и заставить программу произвести адаптацию вместо вас. Рассмотрим следующий пример:
Строка
Выводит на экран строку "HelloWorld". Допустим, x - объект класса HelloWorld или одного из его наследников.
Строка
выводит на экран строку, содержащую имя класса.
Этот небольшой пример более драматичен, чем кажется - он содержит каждый из вышеупомянутых шагов. Метод printName исследует класс объекта (this.getClass()). Тем самым решение о выводе сообщения передается классу объекта. Метод выводит возвращаемое значение. Без переопределения, метод printName ведет себя по-разному для каждого подкласса HelloWorld. Метод printName удобен, он адаптируется к классу, который его наследует, вызывая изменение поведения.
Рефлексия - это возможность выполнения программы для исследования самой себя и программного окружения, и изменения того, что найдет. Для проведения самоисследования, программе необходимо иметь представление о самой себе. Эта информация называется метаданными. В объектно-ориентированном мире, метаданные организованы внутри объектов, именуемых метаобъектами.
Самоисследование метаобъектов во время выполнения называется introspection или самоанализ. Как мы видим, в предыдущем примере за шагом самоанализа следует изменение поведения. В общем, существует три методики, которые может использовать Reflection API для осуществления изменений в поведении: прямое изменение метаобъектов, операции для использования метаданных (такие как динамический вызов метода) и метод самоанализа, в котором коду разрешается вмешиваться в различные фазы выполнения программы. Java содержит богатый набор операций для использования метаданных и всего лишь несколько возможностей для самоанализа. В дополнение к вышесказанному, java избегает многих осложнений, не позволяя прямого изменения метаобъектов.
Эти свойства дают рефлекции всю мощь для того, чтобы сделать программное обеспечение гибким. Приложения, написанные с помощью рефлексии, более просто адаптируются ко всем изменениям в требованиях. Рефлексия - мощный инструмент, но не магический. Вы должны овладеть этим инструментом, чтобы придать гибкости своему продукту. Недостаточно лишь изучить концепции использования API. Вы также должны быть способны различать ситуации, в которых без рефлексии не обойтись и те, в которых ее следует избегать.
Конец
Материалы, которые могут вас заинтересовать
- Java Reflection. Динамическая загрузка и рефлективная конструкция. Часть 2
- Java Reflection. Динамическая загрузка и рефлективная конструкция
- Java Reflection. Знакомство с классом Method и его методами
- Java reflection. Поиск метода во время исполнения
- Java. Исследование программы во время выполнения
- Программист Джордж и рефлексия
- Вопрос: Восходящее преобразование и generic
- Legal identifiers in Java.
- Java puzzler. Part 1.







спасибо, напишите об функцианальной парадигме и как её можно применять в джаве. интересует динамическая типизация и функция высшего порядка.
Женя, не хочешь написать про функциАНАЛьную парадигму?
Пардон за мой французский.
Какая-то бредятина. Заголовок "Основы рефлексии", т.е. должно быть всё понятно, а в начале какая то ерись. 5 строк кода и весь пример. Кароче говницо ваша статья, тут ничему не научиться.
Согласен, начало непонятное.
Отправить комментарий