L'operatore dell'istanza di Java è considerato riflessione, e cosa definisce la riflessione?


24

Ho avuto una discussione con un collega oggi, se l'uso dell'uso dell'operatore Java instanceofè una specie di riflessione. E la discussione si è rapidamente evoluta in ciò che in realtà definisce la riflessione.

Quindi, qual è la definizione di riflessione?

E l'uso di instanceof"usare la riflessione" è considerato?

Inoltre, se instanceofsi considera la riflessione, il polimorfismo non sta anche "usando la riflessione"? In caso contrario, qual è la differenza?


4
Hai praticamente risposto alla tua domanda. Il modo in cui si definisce "riflessione" determina se instanceofè un esempio di riflessione. Certamente si trova tra il normale utilizzo dei dati e l'uso dei metadati tramite getClass()& friends, ma puoi avere definizioni praticabili in qualsiasi modo.
Kilian Foth,

L'uso della return"programmazione strutturale" è considerato?
SF.

Risposte:


22

Questa è la definizione di riflessione secondo Wikipedia:

Nell'informatica, la riflessione è il processo attraverso il quale un programma per computer può osservare (digitare l'introspezione) e modificare la propria struttura e comportamento in fase di esecuzione.

Non avrei potuto dirlo meglio e ho sottolineato la parte importante della tua domanda. Detto questo, sì, instanceofè considerato usando la riflessione. Il programma osserva la sua struttura e conduce l' introspezione del tipo .


3
@Steven Jeuris: La differenza è che if (true)guarda un valore , non un tipo . Ecco perché non è considerato riflesso.
sleske,

1
@sleske: Il motivo per cui l'ho menzionato è perché osservare un tipo è un principio così rudimentale. Senza di essa non ci sarebbe polimorfismo. Tecnicamente, ciò significa che una semplice sostituzione potrebbe anche essere considerata una riflessione (o almeno risultati). Non dimenticare la seconda parte della definizione: e modificare la propria struttura e comportamento in fase di esecuzione. Nel complesso ho votato a favore di questa risposta (controlla il mio secondo commento), ma capisco da dove proviene la domanda del PO. ; p
Steven Jeuris,

1
Secondo tale definizione di riflessione, il polimorfismo normale non sarebbe anche una specie di riflessione?
Bjarke Freund-Hansen,

4
@bjarkef: Direi "no", poiché l'invio virtuale utilizzato dal polimorfismo è implicitamente fatto dal linguaggio stesso, piuttosto che dal codice dell'applicazione che esamina esplicitamente l'oggetto in questione per identificarne le caratteristiche.
Dave Sherohman,

2
@Dave Sherohman: aggiungerei anche che la maggior parte del lavoro (impostazione delle tabelle di salto, ecc.) Viene eseguita in fase di compilazione, non in fase di esecuzione.
TMN,

13

Per motivi di chiarezza, prenderei in considerazione due risposte.

Teoricamente , instanceofè una forma di riflessione, come spiegato nella risposta di Falcon .

Nell'informatica, la riflessione è il processo attraverso il quale un programma per computer può osservare (digitare l'introspezione) e modificare la propria struttura e comportamento in fase di esecuzione.

Tuttavia, in pratica , quando un programmatore parla dell'uso della riflessione, di solito si riferisce a molto più che semplicemente controllare se una variabile è di un certo tipo. Questo è un concetto così rudimentale, senza il quale il polimorfismo non sarebbe possibile .

Si noti che l'uso instanceofspesso indica un odore di codice e al suo posto è spesso possibile utilizzare un polimorfismo appropriato.


1
+1 per l'odore del codice potenziale - non sempre, solo il potenziale
Gary Rowe


2

Poiché le altre risposte, la definizione in Wikipedia è stata modificata (mi capita di concordare con questo cambiamento, ma non sono stato io a farlo) per rimuovere la parte tra parentesi:

In informatica, la riflessione è la capacità di un programma per computer di esaminare, introspettare e modificare la propria struttura e comportamento in fase di esecuzione.

https://en.wikipedia.org/wiki/Type_introspection dice anche specificamente

L'introspezione non deve essere confusa con la riflessione

Non prenderei in considerazione instanceofcadere sotto la prima definizione: il programma prende in esame un valore, non la sua propria struttura, e non comporta alcun valori che rappresentano la struttura del programma (in Java: java.lang.Class, java.reflect.Method, etc.); il segno distintivo della riflessione sta lavorando con tali valori.


-5

SÌ, l'operatore "instanceof" è una forma di riflessione. Le risposte precedenti ti dicono perché.

"Riflessione" o "introspezione oggetto / classe" è un clamore in questi giorni, ma diversi linguaggi di programmazione hanno usato parte di quel concetto, da qualche tempo.

DOT NET (clone Java), (mis) usa molto.


1
Uuuuhm, ... amico?
Konrad Rudolph,

3
La tua prima frase è corretta e ridondante di fronte alle risposte precedenti. Il resto è semplicemente sbagliato.
Frank Shearar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.