Сегодня я обсуждал с коллегой, является ли использование оператора Java instanceof
своего рода отражением. И дискуссия быстро переросла в то, что на самом деле определяет отражение.
Итак, каково определение отражения?
И считается ли использование instanceof
«использованием отражения»?
И, кроме того, если instanceof
рассматривать отражение, то разве полиморфизм также не «использует отражение»? Если нет, то в чем разница?
java
language-agnostic
language-features
reflection
Бьярке Фрейнд-Хансен
источник
источник
instanceof
является ли пример отражения. Конечно, это где-то между обычным использованием данных и использованием метаданных черезgetClass()
& friends, но вы можете получить работоспособные определения в другом месте.return
рассматриваемым «структурным программированием»?Ответы:
Это определение отражения согласно википедии:
Я не мог бы сказать это лучше сам и выделил важную часть вашего вопроса. Тем не менее, да,
instanceof
считается использование отражения. Программа соблюдает свою структуру и проводит самоанализ типа .источник
if (true)
смотрит на значение , а не на тип . Вот почему это не считается отражением.Для ясности я бы рассмотрел два ответа.
Теоретически ,
instanceof
это форма отражения, как объяснено в ответе Сокола .Однако практически , когда программист говорит об использовании рефлексии, он обычно имеет в виду гораздо больше, чем просто проверку, является ли переменная определенного типа. Это такая элементарная концепция, без которой полиморфизм был бы невозможен .
Обратите внимание, что использование
instanceof
часто указывает на запах кода, и вместо этого часто можно использовать правильный полиморфизм.источник
Вас может заинтересовать следующая статья: http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Ключевым моментом в этой статье является фрагмент кода, где они моделируют ключевое слово instanceof с помощью метода isInstance класса «Class», который является частью функции отражения Java.
источник
После других ответов определение в Википедии было изменено (я согласен с этим изменением, но я не тот, кто его сделал), чтобы убрать часть в скобках:
https://en.wikipedia.org/wiki/Type_introspection также специально говорит
Я не считаю
instanceof
, подпадают под первое определение: программа анализирует значение, а не свою собственную структуру, и она не включает в себя какие - либо значения , представляющие структуру программы (в Java:java.lang.Class
,java.reflect.Method
и т.д.); отличительной чертой отражения является работа с такими ценностями.источник
ДА, оператор instanceof - это форма отражения. Предыдущие ответы говорят вам, почему.
«Отражение» или «интроспекция объекта / класса» в наши дни - шумиха, но некоторые языки программирования с некоторого времени уже используют эту концепцию.
DOT NET (Java клон), (неправильно) использует много.
источник