Считается ли оператор Java instanceof отражением, и что определяет отражение?

24

Сегодня я обсуждал с коллегой, является ли использование оператора Java instanceofсвоего рода отражением. И дискуссия быстро переросла в то, что на самом деле определяет отражение.

Итак, каково определение отражения?

И считается ли использование instanceof«использованием отражения»?

И, кроме того, если instanceofрассматривать отражение, то разве полиморфизм также не «использует отражение»? Если нет, то в чем разница?

Бьярке Фрейнд-Хансен
источник
4
Вы в значительной степени ответили на свой вопрос. То, как вы определяете «отражение», определяет, instanceofявляется ли пример отражения. Конечно, это где-то между обычным использованием данных и использованием метаданных через getClass()& friends, но вы можете получить работоспособные определения в другом месте.
Килиан Фот
Является ли использование returnрассматриваемым «структурным программированием»?
SF.

Ответы:

22

Это определение отражения согласно википедии:

В компьютерных науках рефлексия - это процесс, с помощью которого компьютерная программа может наблюдать (делать самоанализ типа) и изменять свою собственную структуру и поведение во время выполнения.

Я не мог бы сказать это лучше сам и выделил важную часть вашего вопроса. Тем не менее, да, instanceofсчитается использование отражения. Программа соблюдает свою структуру и проводит самоанализ типа .

сокол
источник
3
@ Steven Jeuris: Разница в том, что он if (true)смотрит на значение , а не на тип . Вот почему это не считается отражением.
Слёске
1
@sleske: Причина, по которой я упомянул это, была в том, что наблюдение за типом - такой элементарный принцип. Без этого не было бы полиморфизма. Говоря технически, это означает, что простое переопределение также можно считать отражением (или, по крайней мере, результатом). Не забывайте вторую часть определения: и изменяйте свою структуру и поведение во время выполнения. В общем, я проголосовал за этот ответ (проверьте мой второй комментарий), но я понимаю, откуда возник вопрос от ОП. ; p
Стивен Джеурис
1
Согласно этому определению отражения, не будет ли нормальный полиморфизм также отражением?
Бьярке Фрейнд-Хансен
4
@bjarkef: Я бы сказал «нет», поскольку виртуальная диспетчеризация, используемая полиморфизмом, выполняется неявно самим языком, а не кодом приложения, явно исследующим рассматриваемый объект для определения его характеристик.
Дейв Шерохман,
2
@Dave Sherohman: Я бы также добавил, что большая часть работы (настройка таблиц переходов и т. Д.) Выполняется во время компиляции, а не во время выполнения.
TMN
13

Для ясности я бы рассмотрел два ответа.

Теоретически , instanceofэто форма отражения, как объяснено в ответе Сокола .

В компьютерных науках рефлексия - это процесс, с помощью которого компьютерная программа может наблюдать (делать самоанализ типа) и изменять свою собственную структуру и поведение во время выполнения.

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

Обратите внимание, что использование instanceofчасто указывает на запах кода, и вместо этого часто можно использовать правильный полиморфизм.

Стивен Джеурис
источник
1
+1 для потенциального запаха кода - не всегда, только потенциал
Гэри Роу
2

Вас может заинтересовать следующая статья: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Ключевым моментом в этой статье является фрагмент кода, где они моделируют ключевое слово instanceof с помощью метода isInstance класса «Class», который является частью функции отражения Java.

Jalayn
источник
Хорошее объяснение для Java.
Сокол
2

После других ответов определение в Википедии было изменено (я согласен с этим изменением, но я не тот, кто его сделал), чтобы убрать часть в скобках:

В компьютерных науках рефлексия - это способность компьютерной программы исследовать, анализировать и изменять свою собственную структуру и поведение во время выполнения.

https://en.wikipedia.org/wiki/Type_introspection также специально говорит

Самоанализ не следует путать с размышлением

Я не считаю instanceof, подпадают под первое определение: программа анализирует значение, а не свою собственную структуру, и она не включает в себя какие - либо значения , представляющие структуру программы (в Java: java.lang.Class, java.reflect.Methodи т.д.); отличительной чертой отражения является работа с такими ценностями.

Алексей романов
источник
-5

ДА, оператор instanceof - это форма отражения. Предыдущие ответы говорят вам, почему.

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

DOT NET (Java клон), (неправильно) использует много.

umlcat
источник
1
Ууууу, чувак?
Конрад Рудольф
3
Ваше первое предложение является правильным и излишним перед лицом предыдущих ответов. Остальное просто неправильно.
Фрэнк Шиарар