執(zhí)行引擎在執(zhí)行Java代碼時(shí)候可能會有解釋執(zhí)行和編譯執(zhí)行兩種選擇招刨,也可能兩者兼?zhèn)漩踔吝€可能會包含幾個(gè)不同級別的編譯器執(zhí)行引擎。
棧幀
- 局部變量表
- 操作數(shù)
- 動態(tài)連接
- 方法返回地址
- 附加信息
方法調(diào)用
解析
方法在程序真正運(yùn)行之前就有一個(gè)可確定的調(diào)用版本沉眶,并且這個(gè)方法的調(diào)用版本在運(yùn)行期是不可變得打却。
- invokestatic
- invokespecial
- invlkevirtual
- invokeinterface
- invokedynamic
分派
- 1.靜態(tài)分派
靜態(tài)類型(Static Type)
實(shí)際類型(Actual Type)
靜態(tài)類型在編譯期就可知,實(shí)際類型只有在運(yùn)行期才能確定谎倔。
所有依賴j靜態(tài)類型來定位方法執(zhí)行版本的分派動作稱為靜態(tài)分派柳击,典型應(yīng)用時(shí)方法重載。 - 2.動態(tài)分派
重寫(Override)
運(yùn)行期根據(jù)實(shí)際類型確定方法執(zhí)行版本的分派過程稱為動態(tài)分派 - 3.單分派與多分派
方法的接收者與方法的參數(shù)統(tǒng)稱為方法的宗量片习。根據(jù)分派基于多少種宗量捌肴,可以將分派劃分為單分派和多分派兩種。單分派是根據(jù)一個(gè)宗量對目標(biāo)方法進(jìn)行選擇藕咏,多分派則是根據(jù)多于一個(gè)宗量對目標(biāo)方法進(jìn)行選擇状知。 - 虛擬機(jī)動態(tài)分派的實(shí)現(xiàn)
虛方法表
接口方法表
動態(tài)類型語言支持
- 1.動態(tài)類型語言
什么是動態(tài)類型語言?動態(tài)類型語言的關(guān)鍵特征是它的類型檢查的主體過程是在運(yùn)行期而不是在編譯期孽查。如JavaScript饥悴,Lua,靜態(tài)類型語言如C++盲再、Java - 2.JDK1.7與動態(tài)類型
- 3.java.lang.invoke包
MethodHandle
與反射的區(qū)別
1).從本質(zhì)上講西设,Reflection和MethodHandle機(jī)制都是在模仿方法的調(diào)用,但Reflection是在模擬Java代碼層次的方法調(diào)用,而MethodHandle是在模擬字節(jié)碼層次的方法調(diào)用答朋。
2).Reflection中的java.lang.reflect.Method對象遠(yuǎn)比MethodHandle機(jī)制中的java.lang.invoke.MethodHandle對象所包含的信息多济榨。前者是方法在Java一端的全面映像,包含了方法的簽名绿映、描述符以及方法屬性表中各個(gè)屬性的Java端表示方式擒滑,還包含執(zhí)行權(quán)限等運(yùn)行期信息。而后者僅僅包含于執(zhí)行該方法相關(guān)的信息叉弦。用通俗的話來將丐一,Reflection是重量級的,而MethodHandle是輕量級淹冰。
3).由于MethodHandle是對字節(jié)碼的方法指令調(diào)用模擬库车,所以理論上虛擬機(jī)在這方面做的各種優(yōu)化,在MethodHandle上也應(yīng)當(dāng)可以采用類似思路去支持樱拴。而通過反射去調(diào)用方法則不行柠衍。
4.invokedynamic指令
5.掌控方法分派規(guī)則