Представляем концепцию отражения
Прежде чем обсуждать концепцию отражения и ее реализацию на 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.