jvm內部有五種呼叫方法的指令
invokeinte***ce 用以呼叫介面方法,在執行時搜尋乙個實現了這個介面方法的物件,找出適合的方法進行呼叫。(invoke inte***ce method)invokevirtual 指令用於呼叫物件的例項方法,根據物件的實際型別進行分派(invoke instance method; dispatch based on class)
invokestatic 用以呼叫類方法(invoke a class (static) method )
invokespecial 指令用於呼叫一些需要特殊處理的例項方法,包括例項初始化方法、私有方法和父類方法。(invoke instance method; special handling for superclass, private, and instance initialization method invocations )
invokedynamic jdk1.7新加入的乙個虛擬機器指令,相比於之前的四條指令,他們的分派邏輯都是固化在jvm內部,而invokedynamic則用於處理新的方法分派:它允許應用級別的**來確定執行哪乙個方
invokestatic和invokespecial是在編譯器確定的,他們適用於不會發生重寫的情況
invokevirtual和invokeinte***ce 是虛方法,這兩個指令在呼叫時,通過一張方法表來呼叫。看兩個類
public class animal}public class bird extends animal implements fly
@override
public void fly()
public static void print()
}
兩個類對應的方法表
animal的方法表
0
sleep
bird方法表
0sleep
1fly
如果重寫父類的方法,父類方法的index和子類的一致,方便查詢。
由上可知,使用繼承或實現會讓程式變慢,因為需要查方法表,但是沒有必要因為慢而放棄物件導向良好的設計,因為這個時間很短並且jvm還有針對虛方法的優化,內聯快取。
內聯快取舉個例子來說
animal animal = new bird();
animal.sleep();
這個時候jvm快取下bird物件和sleep方法,下次bird物件想要呼叫sleep方法時,快取裡存了bird的方法就不用去查表了。
JVM方法呼叫指令
終於把inside jvm這本看完了,好久沒這麼細緻的看一本書了。好多人都寫了文章討論jvm如何實現多型的,我只是簡單做個筆記。類的位元組碼結構有個常量池,其中就存放了這個類中呼叫的方法的符號引用,這些符號引用實際上是放在一些特殊型別 constant nameandtype info 的常量池入口...
JVM 方法呼叫之動態分派 詳解
1.動態分派 乙個體現是重寫 override 程式設計客棧。下面的 執行結果很明顯。public class app class super public void f int i class sub extends super overwww.cppcns.comride public void...
Android是怎樣呼叫硬體加速的
android是怎樣呼叫硬體加速的 描述 如果處理器只有2d硬體加速而沒有3d硬體加速,則可以利用opengl中的libagl,實現封裝在libagl裡的copybit,因為相對3d api來說,這個模組的封裝google 基本是做好的,只要去實現乙個copybit hal即可 如果處理器2d 3d...