Moje pytanie brzmi: w jaki sposób informacje o klasie są ładowane podczas uruchamiania?Różnica między RTTI a odbiciem w Javie
Kiedy ktoś dzwoni pod numer instanceof
, jest uważany za RTTI lub odbicie? Czy to zależy od rzeczywistej sytuacji?
Moje pytanie brzmi: w jaki sposób informacje o klasie są ładowane podczas uruchamiania?Różnica między RTTI a odbiciem w Javie
Kiedy ktoś dzwoni pod numer instanceof
, jest uważany za RTTI lub odbicie? Czy to zależy od rzeczywistej sytuacji?
Termin "RTTI" jest terminem specyficznym dla C++ odnoszącym się do funkcjonalności języka podstawowego, który umożliwia programowi określenie dynamicznych typów różnych obiektów w czasie wykonywania. Zwykle odnosi się do operatorów dynamic_cast
lub typeid
, wraz z powiązanym obiektem std::type_info
wyprodukowanym przez typeid
.
Termin "odbicie" jest ogólnym terminem używanym w różnych językach programowania w odniesieniu do zdolności programu do sprawdzania i modyfikowania jego obiektów, typów itp. W czasie wykonywania.
Termin Słyszałem stosowane do instanceof
jest type introspection i instanceof
jest czasem określane jako obiektu introspekcji, ponieważ program może spojrzeć na prowadzących do określenia typów, jakie działania podjąć. Myślę, że jest to pojęcie słabsze od refleksji, ponieważ nie pozwala na skomplikowaną introspekcję na polach lub metodach obiektu, ale nie sądzę, by byłoby technicznie niepoprawne wywołać użycie odbicia operatora.
Co do innego pytania - w jaki sposób informacje o klasach są ładowane w czasie wykonywania? - to naprawdę zależy od wdrożenia JVM. Typ ClassLoader
jest ostatecznie odpowiedzialny za ładowanie klas do systemu, ale JVM może to zinterpretować, jakkolwiek tego chce. Kiedyś zbudowałem prototypową maszynę JVM w JavaScript, a wewnętrznie wszystkie wywołania refleksji właśnie przeszukały podstawowe struktury danych JS, które miałem na celu reprezentowania klas, pól i metod. Mogę sobie wyobrazić, że maszyna wirtualna HotSpot JVM robi coś zupełnie innego, ale jest prawie zdefiniowana przez implementację.
Mam nadzieję, że to pomoże!
W skrócie, prawdziwą różnicą między RTTI i refleksją jest to, że przy RTTI kompilator otwiera i analizuje plik .class w czasie kompilacji. Z refleksją plik .class jest niedostępny podczas kompilacji; jest otwierany i badany przez środowisko uruchomieniowe.
Tak więc prawdziwą różnicą między RTTI i refleksją jest to, że przy RTTI kompilator otwiera i analizuje plik .class w czasie kompilacji. Innymi słowy, możesz wywołać wszystkie metody obiektu w "normalny" sposób. Z refleksją plik .class jest niedostępny podczas kompilacji; jest otwierany i badany przez środowisko uruchomieniowe. (с)
dzięki! W jaki sposób dowiedziałem się o RTTI na moim kursie Java, prawdopodobnie dlatego się pomyliłem: S – godlamp