Представляем концепцию отражения

Прежде чем обсуждать концепцию отражения и ее реализацию на Java, позвольте мне привести цитату из книги Роберта В. Себесты Концепции языков программирования:

«Обсуждение отражения не идеально подходит для главы об объектной ориентации, но еще хуже подходит для любой другой главы этой книги».

Как напрашивается, я собираюсь высмеивать концепцию рефлексии на протяжении всего эссе, понимая ее важность.

Определение отражения

Доступ во время выполнения для изменения типов и структуры языков может быть полезен. Иными словами, программы должны проанализировать (изучить) свои метаданные (типы и структуру).

Отражение в первую очередь применяется при создании программных инструментов - IDE, отладчиков, браузеров классов и т. Д.

Класс Класс

Поскольку часто много теоретизировать не имеет смысла, давайте перейдем к рассмотрению того, как отражение реализовано в Java.

java.lang.Class пространство имен определяет основной класс для метаданных, класс Class, который предоставляет методы для проверки типов и членов программных объектов. Система времени выполнения Java создает экземпляр класса для каждого объекта.

getClass получает объект Class объекта. Например, “hello”.getClass(); получает объект String.

Если объекта класса нет, присоединение .class к концу получит имя класса: String.class То же самое можно сделать с классом без имени: int[][].class

Четыре метода

Все, что у меня есть, это четыре метода. Все эти методы необходимы для получения класса метода.

Первый метод - метод thegetMethod. Метод getMethod (определенный в классе Class) ищет в классе конкретный общедоступный метод, определенный в классе или суперклассе.

Второй метод - это метод getMethods. Метод getMethods (определенный в классе Class) возвращает массив всех общедоступных методов, определенных в классе или суперклассе.

Третий метод - это getDeclareMethod метод, который ищет определенный метод, объявленный в классе.

Четвертый способ вы можете догадаться сами.

Пятый метод

Если объект Class объекта известен и конкретный метод найден, этот метод может быть вызван через объект Method метода с помощью метода invoke: method.invoke(...);

Недостатки отражения

Документация Java допускает способность отражения, но, несмотря на это, возможности Java для этого весьма ограничены. Основная проблема разработчиков Java-рефлексии, вероятно, заключалась в ее безопасности. Reflection также не допускает некоторых оптимизаций виртуальной машины Java, что приводит к снижению производительности. Открытие закрытых полей нарушает правила абстракции и может отрицательно повлиять на переносимость.

Обезьяны отражения

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

Например, в Лиспе обычно используется отражение. Другие интерпретируемые языки, JavaScript, Perl и Python, сохраняют таблицу символов во время реализации для доступа к полезной информации о типах.

Заключение

В книге «Концепции языков программирования» даже не обсуждаются методы для конструкторов (например, getConstructor), а тема отражения, несмотря на свою важность, очень ограничена для языка программирования Java.