U Javi, prvo je postojala Class ili Object?
U objektnom modelu Jave:
- Sve klase su instance klase Class, Object je klasa, pa je Object takođe instanca klase Class.
- Sve klase se na kraju nasleđuju od klase Object, Class je klasa, pa se Class takođe nasleđuje od Object.
Pa da li je prvo postojala Class ili Object? Kako JVM rešava ovaj „kokošji" problem?

Za ovo pitanje, na Zhihu-ju sam video odgovor velikog R, koji je upravo rešio moje sumnje, pa delim sa svim prijateljima kao referencu i inspiraciju~
Autor: RednaxelaFX, priredio: Chenmo Wang Er, referenca: https://www.zhihu.com/question/30301819/answer/47539163
„Kokošji problem" se obično rešava procesom koji se zove „bootstrap".
Osnovna kontradikcija „kokošjeg problema" leži u pretpostavci da će „kokos" ili „jaje" prvo morati da uđu u „potpuno dostupno" stanje. A mnogi realni slučajevi pojednostavljeni kao „kokošji problem" se zapravo mogu inicijalizirati u „haosu" — ni „kokos" ni „jaje" ne moraju prvo da budu potpuno spremni, nema problema redosleda; u procesu inicijalizacije oba nisu u „potpuno dostupnom" stanju, a po završetku inicijalizacije oba ulaze u dostupno stanje.
Da ilustrujem na primeru: jaje sa paradjozom. Prvo ne treba potpuno da isprži jaje, zatim potpuno da isprži paradjoz, pa onda da pomešaš oba polusprema i zajedno da ispržiš — to bi se radilo tako što prvo ispržiš jaje do polusprema, zatim jaje do polusprema, i onda pomešaš oba polusprema i zajedno ispržiš.
Za problem prvo Class ili Object, pretpostavka da su sve klase instance klase Class i da je Object klasa, pa je Object takođe instanca klase Class — je pogrešna.
java.lang.Object je Java klasa, ali nije instanca klase java.lang.Class. Potonja je samo tip koji opisuje Java klase i interfejse, koristi se za podršku refleksionih operacija. U ovome se Java razlikuje od nekih čistije objektno-orijentisanih jezika (kao što su Python i Ruby).
Druga pretpostavka „sve klase se na kraju nasleđuju od klase Object, Class je klasa, pa se Class takođe nasleđuje od Object" je tačna, java.lang.Class je izvedena klasa od java.lang.Object, prva se nasleđuje od potonje.
Iako prva pretpostavka nije tačna, „kokošji problem" i dalje postoji: u pokrenutom i upotrebljivom Java objektnom sistemu mora postojati instanca klase java.lang.Class koja odgovara klasi java.lang.Object; a java.lang.Class je izvedena klasa od java.lang.Object, po „opštom razmišljanju" potonja treba da se završi inicijalizaciju nakon što se prva završi...
Stvarnost je: ove međuzavisne osnovne tipove se potpuno mogu inicijalizovati u „haosu" odjednom, a zatim se stanje objektnog sistema smatra završenim „bootstrap-om", posle čega se mogu poštovati opšta pravila Java objektnog sistema. JVM, JavaScript, Python, Ruby i slični runtime imaju takve bootstrap procese.
U „haosu" (bootstrap procesu), JVM može prvo alocirati memorijski prostor za najvažnije osnovne tipove u objektnom sistemu, da uđu u stanje [alociran prostor] ali [još uvek potpuno neinicijalizovan].
U ovom trenutku ovi objekti iako su alocirani, jer stanje još uvek nije kompletno, ne mogu da se koriste. Zatim, kroz ovaj alocirani prostor se povezuju referencne relacije između ovih osnovnih tipova.
Do sada su sve akcije obavio JVM, još uvek nije izvršen nijedan Java bajtkod. Zatim ovi osnovni tipi ulaze u stanje [potpuno inicijalizovan], objektni sistem može da počne da sam se izvršava, tj. može da počne da izvršava Java bajtkod za dalju inicijalizaciju Java sistema.
U HotSpot VM-u postoji C++ klasa „Universe" koja beleži opšte stanje objektnog sistema. Ima dva zanimljiva polja koja beleže trenutno da li je u fazi bootstrapping-a ili je potpuno inicijalizovan:
static bool is_bootstrapping() { return _bootstrapping; }
static bool is_fully_initialized() { return _fully_initialized; }Zatim funkcija Universe::genesis() će se u fazi bootstrap-a kreirati objektni modele ključnih tipova, gde će pozvati SystemDictionary::initialize() da inicijalizuje ključne tipove objektnog sistema, gde će dalje pozvati SystemDictionary::initialize_preloaded_classes() da kreira java.lang.Object, java.lang.Class i druge ključne tipove.
Ova funkcija nakon učitavanja ključnih tipova kao java.lang.Object, java.lang.Class itd. će pozvati Universe::fixup_mirrors() da obavi gore pomenuto „povezivanje referenci":
// Fixup mirrors for classes loaded before java.lang.Class.
// These calls iterate over the objects currently in the perm gen
// so calling them at this point is matters (not before when there
// are fewer objects and not later after there are more objects
// in the perm gen.
Universe::initialize_basic_type_mirrors(CHECK);
Universe::fixup_mirrors(CHECK);
void Universe::fixup_mirrors(TRAPS) {
// Bootstrap problem: all classes gets a mirror (java.lang.Class instance) assigned eagerly,
// but we cannot do that for classes created before java.lang.Class is loaded. Here we simply
// walk over permanent objects created so far (mostly classes) and fixup their mirrors. Note
// that the number of objects allocated at this point is very small.
// ...
}Upravo tako: „Object ima člansku promenljivu koja pokazuje na instancu klase Class c, c čuva mapu imena i adresa članova i metoda Object-a za refleksiju." Uključuje nekoliko glavnih klasa:
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/ade5be2b1758/src/share/vm/memory/universe.hpp#l399
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/ade5be2b1758/src/share/vm/memory/universe.cpp#l259
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/ade5be2b1758/src/share/vm/classfile/systemDictionary.cpp#l1814Na kraju, Erge ću reći par reči. Svaki put kado čitam sadržaj velikog R, uvek mi se kao da klecaju da klečnem, ljudi koji su napisali JVM zaista nisu obični. Ako se volite baviti analizom CPP izvornog koda, možete dublje da učite, sigurno ćete nešto steći.
Otvoreni kod na GitHubu sa više od 17000 zvezdica „Ergeov put do naprednog Jave“ konačno je izašao u PDF formatu prvog izdanja! Uključuje osnovnu sintaksu Jave, nizove & stringove, OOP, okvir kolekcija, Java IO, obradu izuzetaka, nove karakteristike Jave, mrežno programiranje, NIO, konkurentno programiranje, JVM i tako dalje, ukupno preko 320.000 reči, više od 500 ručno crtanih slika, može se reći da je jednostavno i razumevo, duhovito... Detalje: Sjajno, Java tutorijal na GitHubu sa više od 17000 zvezdica
