L'opérateur Java instanceof est-il considéré comme une réflexion, et qu'est-ce qui définit la réflexion?

24

J'ai eu une discussion avec un collègue aujourd'hui, si l'utilisation de l'utilisation de l'opérateur Java instanceofest une sorte de réflexion. Et la discussion a rapidement évolué vers ce qui définit réellement la réflexion.

Alors, quelle est la définition de la réflexion?

Et l'utilisation de la instanceofréflexion est-elle considérée comme "utilisant la réflexion"?

Et en plus, si l' instanceofon considère la réflexion, le polymorphisme n'est-il pas également "utilisant la réflexion"? Sinon, quelle est la différence?

Bjarke Freund-Hansen
la source
4
Vous avez à peu près répondu à votre propre question. La façon dont vous définissez la «réflexion» détermine s'il instanceofs'agit d'un exemple de réflexion. Certes, il se situe entre l'utilisation normale des données et l'utilisation des métadonnées via getClass()& friends, mais vous pouvez avoir des définitions viables.
Kilian Foth
L'utilisation de la return"programmation structurelle" est-elle considérée?
SF.

Réponses:

22

Voici la définition de la réflexion selon wikipedia:

En informatique, la réflexion est le processus par lequel un programme informatique peut observer (faire l'introspection de type) et modifier sa propre structure et son comportement au moment de l'exécution.

Je n'aurais pas pu mieux le dire moi-même et souligné la partie importante de votre question. Cela dit, oui, il instanceofest envisagé d'utiliser la réflexion. Le programme observe sa structure et effectue une introspection de type .

Faucon
la source
3
@Steven Jeuris: La différence est que l'on if (true)regarde une valeur , pas un type . C'est pourquoi ce n'est pas considéré comme une réflexion.
sleske
1
@sleske: La raison pour laquelle je l'ai mentionné était parce que l'observation d'un type est un principe rudimentaire. Sans elle, il n'y aurait pas de polymorphisme. Techniquement parlant, cela signifie qu'une simple dérogation pourrait également être considérée comme une réflexion (ou du moins comme un résultat). N'oubliez pas la deuxième partie de la définition: et modifiez sa propre structure et son comportement lors de l'exécution. Dans l'ensemble, j'ai voté pour cette réponse (consultez mon deuxième commentaire), mais je comprends d'où vient la question du PO. ; p
Steven Jeuris
1
Selon cette définition de la réflexion, le polymorphisme normal ne serait-il pas aussi une sorte de réflexion?
Bjarke Freund-Hansen
4
@bjarkef: Je dirais "non", car la répartition virtuelle utilisée par le polymorphisme se fait implicitement par le langage lui-même, plutôt que le code d'application examinant explicitement l'objet en question pour identifier ses caractéristiques.
Dave Sherohman
2
@Dave Sherohman: J'ajouterais également que la plupart du travail (mise en place de tables de saut, etc.) se fait au moment de la compilation, pas au moment de l'exécution.
TMN
13

Par souci de clarté, je considérerais deux réponses.

Théoriquement , instanceofc'est une forme de réflexion, comme expliqué dans la réponse de Falcon .

En informatique, la réflexion est le processus par lequel un programme informatique peut observer (faire l'introspection de type) et modifier sa propre structure et son comportement lors de l'exécution.

Cependant, en pratique , lorsqu'un programmeur parle d'utiliser la réflexion, il se réfère généralement à bien plus que simplement vérifier si une variable est d'un certain type. C'est un concept tellement rudimentaire, sans lequel le polymorphisme ne serait pas possible .

Notez que l'utilisation instanceofindique souvent une odeur de code et qu'un polymorphisme approprié peut souvent être utilisé à la place.

Steven Jeuris
la source
1
+1 pour l'odeur potentielle du code - pas toujours, juste le potentiel
Gary Rowe
2

Vous pourriez être intéressant dans l'article suivant: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

La clé de cet article est un extrait de code où ils simulent le mot clé "instanceof" en utilisant la méthode "isInstance" de la classe "Class", qui fait partie de la fonction de réflexion de Java.

Jalayn
la source
Belle explication pour Java.
Falcon
2

Depuis les autres réponses, la définition dans Wikipedia a été modifiée (je suis d'accord avec ce changement, mais ce n'est pas moi qui l'ai fait) pour supprimer la partie entre parenthèses:

En informatique, la réflexion est la capacité d'un programme informatique à examiner, introspecter et modifier sa propre structure et son comportement au moment de l'exécution.

https://en.wikipedia.org/wiki/Type_introspection dit également spécifiquement

L'introspection ne doit pas être confondue avec la réflexion

Je ne considérerais pas instanceoftomber sous la première définition: le programme examine une valeur, et non pas sa propre structure, et il ne comporte pas de valeurs représentant la structure du programme (en Java: java.lang.Class, java.reflect.Method, etc.); la marque de la réflexion est de travailler avec de telles valeurs.

Alexey Romanov
la source
-5

OUI, l'opérateur "instanceof" est une forme de réflexion. Les réponses précédentes vous expliquent pourquoi.

«Réflexion» ou «introspection objet / classe» est un battage médiatique de nos jours, mais plusieurs langages de programmation ont utilisé une partie de ce concept, depuis un certain temps.

DOT NET (clone Java), (mis) utilise beaucoup.

umlcat
la source
1
Uuuuhm,… mec?
Konrad Rudolph
3
Votre première phrase est correcte et redondante face aux réponses précédentes. Le reste est tout simplement faux.
Frank Shearar, le