La mia domanda è quando le informazioni sulla classe vengono caricate durante il runtime?Differenza tra RTTI e riflessione in Java
Quando qualcuno chiama instanceof
è considerato RTTI o riflessione? Oppure dipende dalla situazione attuale?
La mia domanda è quando le informazioni sulla classe vengono caricate durante il runtime?Differenza tra RTTI e riflessione in Java
Quando qualcuno chiama instanceof
è considerato RTTI o riflessione? Oppure dipende dalla situazione attuale?
Il termine "RTTI" è un termine specifico di C++ che fa riferimento alla funzionalità del linguaggio di base che consente al programma di determinare i tipi dinamici di vari oggetti in fase di esecuzione. Solitamente si riferisce agli operatori dynamic_cast
o typeid
e all'oggetto std::type_info
associato a typeid
.
Il termine riflessione, d'altra parte, è un termine generico utilizzato tra i linguaggi di programmazione per fare riferimento alla capacità di un programma di ispezionare e modificare i suoi oggetti, tipi, ecc. In fase di esecuzione.
Il termine che ho sentito applicata al instanceof
è type introspection e instanceof
è a volte indicato come oggetto introspezione, in quanto il programma è permesso di guardare i tipi di funzionamento per determinare quale linea di azione da intraprendere. Penso che questo sia un termine più debole della riflessione, in quanto non consente un'elaborata introspezione sui campi o sui metodi di un oggetto, ma non penso sarebbe tecnicamente scorretto chiamare l'uso del riflesso dell'operatore instanceof
.
Come per l'altra domanda: come vengono caricate le informazioni sulla classe in fase di esecuzione? - questo è davvero all'altezza dell'implementazione della JVM. Il tipo ClassLoader
è in definitiva responsabile del caricamento delle classi nel sistema, ma la JVM può interpretarlo come vuole. Una volta ho costruito un prototipo di JVM in JavaScript e internamente tutte le chiamate di riflessione hanno appena interrogato le strutture di dati JS sottostanti che avevo a disposizione per rappresentare classi, campi e metodi. Immagino che l'HotSpot JVM faccia qualcosa di completamente diverso, ma è praticamente definito dall'implementazione.
Spero che questo aiuti!
In breve, la vera differenza tra RTTI e riflessione è che con RTTI, il compilatore si apre ed esamina il file .class in fase di compilazione. Con la riflessione, il file .class non è disponibile in fase di compilazione; viene aperto ed esaminato dall'ambiente di runtime.
Quindi la vera differenza tra RTTI e reflection è che con RTTI, il compilatore si apre ed esamina il file .class in fase di compilazione. In altre parole, puoi chiamare tutti i metodi di un oggetto nel modo "normale". Con la riflessione, il file .class non è disponibile in fase di compilazione; viene aperto ed esaminato dall'ambiente di runtime. (с)
grazie! In qualche modo ho imparato a conoscere RTTI nel mio corso di Java, che era probabilmente il motivo per cui mi sono confuso: S – godlamp