Meine Frage ist, wann wird die Klasseninfo zur Laufzeit geladen?Unterschied zwischen RTTI und Reflektion in Java
Wenn jemand anruft instanceof
ist das RTTI oder Reflexion? Oder hängt es von der tatsächlichen Situation ab?
Meine Frage ist, wann wird die Klasseninfo zur Laufzeit geladen?Unterschied zwischen RTTI und Reflektion in Java
Wenn jemand anruft instanceof
ist das RTTI oder Reflexion? Oder hängt es von der tatsächlichen Situation ab?
Der Begriff "RTTI" ist ein C++ - spezifischer Begriff, der sich auf die Funktionalität der Kernsprache bezieht, mit der das Programm die dynamischen Typen verschiedener Objekte zur Laufzeit bestimmen kann. Es bezieht sich normalerweise auf die Operatoren dynamic_cast
oder typeid
zusammen mit dem zugehörigen std::type_info
Objekt, das von typeid
produziert wird. Der Begriff Reflexion ist andererseits ein generischer Begriff, der in allen Programmiersprachen verwendet wird, um auf die Fähigkeit eines Programms zu verweisen, seine Objekte, Typen usw. zur Laufzeit zu überprüfen und zu modifizieren.
Der Begriff bewarb ich mich auf instanceof
gehört habe, ist type introspection und instanceof
wird manchmal als Objekt Selbstbeobachtung, da das Programm an den Laufarten zu suchen erlaubt ist, um zu bestimmen, welche Vorgehensweise zu nehmen. Ich denke, das ist ein schwacher Begriff als Reflexion, da es keine eingehende Introspektion auf den Feldern oder Methoden eines Objekts erlaubt, aber ich denke nicht, dass es technisch falsch wäre, die Verwendung der Operatorreflexion instanceof
aufzurufen.
Zu Ihrer anderen Frage - wie werden Klasseninformationen zur Laufzeit geladen? - Das liegt wirklich an der JVM-Implementierung. Der Typ ClassLoader
ist letztendlich dafür verantwortlich, Klassen in das System zu laden, aber die JVM kann dies so interpretieren, wie sie es will. Ich habe einmal eine Prototyp-JVM in JavaScript erstellt, und intern haben alle Reflection-Aufrufe nur die zugrunde liegenden JS-Datenstrukturen abgefragt, die ich zur Darstellung von Klassen, Feldern und Methoden eingerichtet hatte. Ich könnte mir vorstellen, dass die HotSpot JVM etwas völlig anderes macht, aber es ist ziemlich implementationsdefiniert.
Hoffe, das hilft!
Kurz gesagt besteht der wahre Unterschied zwischen RTTI und Reflektion darin, dass der Compiler mit RTTI die .class-Datei zur Kompilierzeit öffnet und untersucht. Bei Reflektion ist die .class-Datei zur Kompilierzeit nicht verfügbar. Es wird von der Laufzeitumgebung geöffnet und untersucht.
Der wahre Unterschied zwischen RTTI und Reflektion besteht also darin, dass der Compiler mit RTTI die .class-Datei zur Kompilierzeit öffnet und untersucht. Mit anderen Worten, Sie können alle Methoden eines Objekts auf "normale" Weise aufrufen. Bei Reflektion ist die .class-Datei zur Kompilierzeit nicht verfügbar. Es wird von der Laufzeitumgebung geöffnet und untersucht. (с)
danke! Irgendwie habe ich in meinem Java-Kurs etwas über RTTI gelernt, weshalb ich wahrscheinlich verwirrt wurde: S – godlamp