O operador Java instanceof do operador é considerado reflexão e o que define reflexão?

24

Hoje tive uma discussão com um colega de trabalho, se o uso do operador Java instanceofé um tipo de reflexão. E a discussão evoluiu rapidamente para o que realmente define reflexão.

Então, qual é a definição de reflexão?

E o uso do instanceof"uso da reflexão" é considerado?

Além disso, se instanceoffor considerado reflexão, o polimorfismo também não está "usando reflexão"? Se não, qual é a diferença?

Bjarke Freund-Hansen
fonte
4
Você praticamente respondeu sua própria pergunta. Como você define 'reflexão' determina se instanceofé um exemplo de reflexão. Certamente está entre o uso normal de dados e o uso de metadados através do getClass()& friends, mas você pode ter definições viáveis ​​de alguma maneira.
precisa saber é o seguinte
O uso de return"programação estrutural" é considerado?
SF.

Respostas:

22

Esta é a definição de reflexão de acordo com a wikipedia:

Na ciência da computação, reflexão é o processo pelo qual um programa de computador pode observar (digitar introspecção) e modificar sua própria estrutura e comportamento em tempo de execução.

Eu não poderia ter dito melhor e destacou a parte importante da sua pergunta. Dito isto, sim, instanceofé considerado usando reflexão. O programa observa sua estrutura e conduz a introspecção de tipos .

Falcão
fonte
3
@ Steven Jeuris: A diferença é que if (true)olha para um valor , não para um tipo . É por isso que não é considerado reflexão.
sleske
11
@lesleske: A razão pela qual eu mencionei foi porque observar um tipo é um princípio tão rudimentar. Sem ele não haveria polimorfismo. Tecnicamente, isso significa que uma substituição simples também pode ser considerada reflexão (ou pelo menos resulta em). Não esqueça a segunda parte da definição: e modifique sua própria estrutura e comportamento em tempo de execução. Apesar de tudo, votei positivamente nesta resposta (verifique meu segundo comentário), mas entendo de onde veio a pergunta do OP. ; p
Steven Jeuris
11
De acordo com essa definição de reflexão, o polimorfismo normal também não seria um tipo de reflexão?
Bjarke Freund-Hansen
4
@ bjarkef: Eu diria "não", pois o envio virtual usado pelo polimorfismo é feito implicitamente pela própria linguagem, em vez do código do aplicativo que examina explicitamente o objeto em questão para identificar suas características.
Dave Sherohman
2
@ Dave Sherohman: Eu também acrescentaria que a maior parte do trabalho (criação de tabelas de salto, etc) é feita em tempo de compilação, não em tempo de execução.
TMN
13

Por uma questão de clareza, consideraria duas respostas.

Teoricamente , instanceofé uma forma de reflexão, conforme explicado na resposta de Falcon .

Na ciência da computação, reflexão é o processo pelo qual um programa de computador pode observar (digitar introspecção) e modificar sua própria estrutura e comportamento em tempo de execução.

No entanto, praticamente , quando um programador fala sobre o uso da reflexão, ele geralmente se refere a muito mais do que apenas verificar se uma variável é de um determinado tipo. Esse é um conceito tão rudimentar, sem o qual o polimorfismo não seria possível .

Observe que o uso instanceofmuitas vezes indica um cheiro de código e o polimorfismo adequado pode ser usado com frequência.

Steven Jeuris
fonte
11
+1 para o potencial cheiro de código - não sempre, apenas o potencial
Gary Rowe
2

Você pode ser interessante no seguinte artigo: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

A chave neste artigo é um trecho de código em que eles simulam a palavra-chave "instanceof" usando o método "isInstance" da classe "Class", que faz parte do recurso de reflexão do Java.

Jalayn
fonte
Boa explicação para Java.
Falcon,
2

Desde as outras respostas, a definição na Wikipedia foi alterada (por acaso concordo com essa alteração, mas não fui eu quem fez isso) para remover a parte entre parênteses:

Na ciência da computação, reflexão é a capacidade de um programa de computador examinar, introspectar e modificar sua própria estrutura e comportamento em tempo de execução.

https://en.wikipedia.org/wiki/Type_introspection também diz especificamente

Introspecção não deve ser confundida com reflexão

Eu não consideraria instanceofa cair sob a primeira definição: o programa examina um valor, não a sua própria estrutura, e não envolve quaisquer valores que representam a estrutura do programa (em Java: java.lang.Class, java.reflect.Method, etc.); a marca da reflexão está trabalhando com esses valores.

Alexey Romanov
fonte
-5

SIM, o operador "instanceof" é uma forma de reflexão. As respostas anteriores mostram o porquê.

"Reflexão" ou "introspecção de objeto / classe" é um hype hoje em dia, mas várias linguagens de programação usam parte desse conceito, há algum tempo.

DOT NET (clone de Java), (mis) usa muito.

umlcat
fonte
11
Uuuuhm… cara?
Konrad Rudolph
3
Sua primeira frase está correta e redundante em face das respostas anteriores. O resto está errado.
precisa saber é o seguinte