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?


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 .


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.


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


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.


-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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.