2013-05-14 22 views
5

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?

risposta

7

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!

+0

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

2

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.

0

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. (с)

Problemi correlati