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

max аватар
95
Находится в разделах:

Мы часто сталкиваемся с проблемами, которые могут быть решены легко и элегантно с использованием рефлексии (reflection). 

Рассмотрим следующие сценарии:

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

Конец
Блез Паскаль утверждает, что доводы, до которых человек додумывается сам, обычно убеждают его больше, нежели те, которые пришли в голову другим.

спасибо, напишите об функцианальной парадигме и как её можно применять в джаве. интересует динамическая типизация и функция высшего порядка.

max аватар

Женя, не хочешь написать про функциАНАЛьную парадигму?  Cool

Пардон за мой французский.

Какая-то бредятина. Заголовок "Основы рефлексии", т.е. должно быть всё понятно, а в начале какая то ерись. 5 строк кода и весь пример. Кароче говницо ваша статья, тут ничему не научиться.

Согласен, начало непонятное.

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке