Kako je instanceof ključna reč implementirana u Javi?
Xiao Er je išao na intervju tog dana, naišao je na ovo pitanje: „**kako je instanceof ključna reč implementirana?“ Intervjuer je hteo da on analizira sa donjeg nivoa, ali Xiao Er nije mogao odgovoriti, pa mi je došao da pita.
Ja sam pokorno lupao glavom, lažno mirno, morao sam da mu dam R-ov odgovor, i rekao sam mu: „savršeno pročitaj, ako ne razumeš posle, dođi ponovo da pitaš..“
Autor: RednaxelaFX, organizovao: Chenmo Wang Er, link: https://www.zhihu.com/question/21574535/answer/18998914

Scenarij 1: programerska pozicija sa platom do 3000 juana
Da bi se prikazalo instanceof ključnu reč u Javi pseukodom prema semantici vreme izvršenja opisanoj u Java jeziku specifikaciji:
// obj instanceof T
boolean result;
if (obj == null) {
result = false;
} else {
try {
T temp = (T) obj; // checkcast
result = true;
} catch (ClassCastException e) {
result = false;
}
}Po kineski: ako postoji izraz obj instanceof T, onda ako obj nije null i (T) obj ne baca ClassCastException izuzetak, vrednost izraza je true, inače je false.
Ako intervjuer kaže „ova glupost“, idi u scenarij 2.
Scenarij 2: Java razvojni pozicija sa platom 6000-8000
JVM ima instrukciju instanceof, a kada Java izvorni kod se kompajlira u Class fajl, Java instanceof operator se mapira na JVM instanceof instrukciju.
javac to ovako radi:
- instanceof je ključna reč koju javac može prepoznati, odgovara Token.INSTANCEOF tipu tokena. Pri leksičkoj analizi skeniranje „instanceof“ ključne reči se mapira na Token.INSTANCEOF token.
- Apstraktno stablo sintakse (AST) ovog kompajlera ima JCTree.JCInstanceOf klasu za predstavljanje instanceof operacije. Pri sintaksičkoj analizi kada se naiđe na instanceof operator, generiše se ovaj JCTree.JCInstanceof čvor.
- Na pola puta treba prema Java specifikaciji pronaći problematične slučajeve instanceof operatora pri kompilaciji.
- Na kraju generišu se bajtkodovi, za JCTree.JCInstanceof čvor se generiše instanceof bajtkod instrukcija.
Odgovor na ovaj nivo već može rešiti mnoge praktične probleme, ako intervjuer još kaže „ovo je još uvek glupost“, idi u scenarij 3.
Scenarij 3: Java napredni razvojni pozicija sa platom 10000
Prvo kratko predstavljanje instanceof bajtkoda:
- Operacija: određuje da li je objekat datog tipa
- Format instrukcije: instanceof|indexbyte1|indexbyte2
- Stanje vrha steka pre i posle instrukcije:
- ……,objectref=>
- ……,result
Još kratak opis: indexbyte1 i indexbyte2 se koriste za konstruisanje indeksa konstantnog basena trenutne klase, objectref je referentnog tipa, može biti instanca neke klase, niza ili interfejsa.
Osnovni proces implementacije: parsira se indeks konstantnog basena konstruisan od indexbyte1 i indexbyte2, zatim se prema Java specifikaciji procenjuje da li je parsirana klasa instanca objectref, i na kraju se upisuje rezultat na vrh steka.
Osnovno je prema specifikaciji da YY implementacija, može se proći osam-deset.
Ako intervjuer i dalje nije zadovoljan, idi u scenarij 4.
Scenarij 4: Java napredni razvojni pozicija sa platom iznad 10000
Ova pozicija se fokusira na optimizaciju performansi itd., R veli može navesti radove:
Rad ne razumem, pa ovde neću pricati (beg).
Rad opisuje algoritam HotSpot VM za procenu podtipa, ovaj kratko dopunjava algoritam koji HotSpot VM zaista koristi od JDK6 do danas:
S.is_subtype_of(T) := {
int off = T.offset;
if (S == T) return true;
if (T == S[off]) return true;
if (off != &cache) return false;
if ( S.scan_secondary_subtype_array(T) ) {
S.cache = T;
return true;
}
return false;
}Dva HotSpot VM kompajlera, Client Compiler (C1) i Server Compiler (C2) imaju dalju optimizaciju implementacije procene podtipa. U stvari u JVM, instanceof funkcionalnost je implementirana četiri puta, VM runtime, interpreter, C1, C2 svaki po jednom.
VM runtime:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/oops/oop.inline.hpp
Na kraju deljenja, Erge će kratko reći.
Ovo pitanje se tiče detalja sintakse, JVM implementacije, kompajlera, i malog dizajna strukture podataka, prilično testira unutrašnju snagu Java programera, ako treba odgovoriti na nivou rada, zaista, intervjuer takođe mora unapred pripremiti tačke znanja, inače ako ne razume odgovor kandidata, vrlo je nelagodno.
U svakom slučaju, mnogi detalji u R-ovom odgovoru sam prvi put čuo, pobegao sam, pobegao......
