¿Se considera el operador Java instanceof como reflexión, y qué define la reflexión?

24

Tuve una discusión con un compañero de trabajo hoy, si el uso del operador de Java instanceofes una especie de reflexión. Y la discusión evolucionó rápidamente hacia lo que realmente define la reflexión.

Entonces, ¿cuál es la definición de reflexión?

¿Y se instanceofconsidera el uso de "usar la reflexión"?

Y además, si instanceofse considera reflexión, ¿el polimorfismo no está también "usando la reflexión"? Sí no, ¿Cuál es la diferencia?

Bjarke Freund-Hansen
fuente
44
Casi has respondido tu propia pregunta. La forma en que define 'reflexión' determina si instanceofes un ejemplo de reflexión. Ciertamente, está en algún lugar entre el uso normal de datos y el uso de metadatos a través de getClass()& friends, pero puede tener definiciones viables de cualquier manera.
Kilian Foth
¿Se returnconsidera el uso de "programación estructural"?
SF.

Respuestas:

22

Esta es la definición de reflexión según wikipedia:

En informática, la reflexión es el proceso por el cual un programa de computadora puede observar (hacer introspección de tipos) y modificar su propia estructura y comportamiento en tiempo de ejecución.

No podría haberlo dicho mejor y resaltado la parte importante de su pregunta. Dicho esto, sí, instanceofse considera usar la reflexión. El programa observa su estructura y realiza introspección de tipo .

Halcón
fuente
3
@ Steven Jeuris: La diferencia es que if (true)analiza un valor , no un tipo . Por eso no se considera reflexión.
sleske
1
@sleske: La razón por la que lo mencioné fue porque observar un tipo es un principio tan rudimentario. Sin ella no habría polimorfismo. Técnicamente hablando, esto significa que una anulación simple también podría considerarse reflexión (o al menos da como resultado). No olvide la segunda parte de la definición: y modifique su propia estructura y comportamiento en tiempo de ejecución. En general, voté por esta respuesta (verifique mi segundo comentario), pero entiendo de dónde vino la pregunta del OP. ; p
Steven Jeuris
1
Según esa definición de reflexión, ¿el polimorfismo normal no sería también un tipo de reflexión?
Bjarke Freund-Hansen
44
@bjarkef: Diría que "no", ya que el despacho virtual utilizado por el polimorfismo se realiza implícitamente por el propio lenguaje, en lugar del código de la aplicación que examina explícitamente el objeto en cuestión para identificar sus características.
Dave Sherohman
2
@Dave Sherohman: También agregaría que la mayor parte del trabajo (configuración de tablas de salto, etc.) se realiza en tiempo de compilación, no en tiempo de ejecución.
TMN
13

En aras de la claridad, consideraría dos respuestas.

Teóricamente , instanceofes una forma de reflexión, como se explica en la respuesta de Falcon .

En ciencias de la computación, la reflexión es el proceso mediante el cual un programa de computadora puede observar (hacer introspección de tipos) y modificar su propia estructura y comportamiento en tiempo de ejecución.

Sin embargo, prácticamente , cuando un programador habla sobre el uso de la reflexión, generalmente se refiere a mucho más que simplemente verificar si una variable es de cierto tipo. Este es un concepto tan rudimentario, sin el cual, el polimorfismo no sería posible .

Tenga en cuenta que el uso a instanceofmenudo indica un olor a código, y en su lugar a menudo se puede usar el polimorfismo adecuado.

Steven Jeuris
fuente
1
+1 para el olor potencial del código - no siempre, solo el potencial
Gary Rowe
2

Puede ser interesante en el siguiente artículo: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

La clave en este artículo es un fragmento de código donde simulan la palabra clave "instanceof" utilizando el método "isInstance" de la clase "Class", que es parte de la función de reflexión de Java.

Jalayn
fuente
Buena explicación para Java.
Falcon
2

Desde las otras respuestas, la definición en Wikipedia ha cambiado (estoy de acuerdo con este cambio, pero no fui yo quien lo hizo) para eliminar la parte entre paréntesis:

En informática, la reflexión es la capacidad de un programa de computadora para examinar, introspectar y modificar su propia estructura y comportamiento en tiempo de ejecución.

https://en.wikipedia.org/wiki/Type_introspection también dice específicamente

La introspección no debe confundirse con la reflexión.

Yo no consideraría instanceofa caer bajo la primera definición: el programa examina un valor, no por su propia estructura, y que no implica ningún valores que representan la estructura del programa (en Java: java.lang.Class, java.reflect.Method, etc.); El sello distintivo de la reflexión es trabajar con tales valores.

Alexey Romanov
fuente
-5

SÍ, el operador "instanceof" es una forma de reflexión. Las respuestas anteriores te dicen por qué.

"Reflexión" o "introspección de objeto / clase" es una exageración en estos días, pero varios lenguajes de programación han usado parte de ese concepto, desde hace algún tiempo.

DOT NET (clon de Java), (mis) usa mucho.

umlcat
fuente
1
Uuuuhm ... ¿amigo?
Konrad Rudolph
3
Su primera oración es correcta y redundante frente a las respuestas anteriores. El resto está mal.
Frank Shearar