jvm是怎樣呼叫方法的

2022-09-06 21:51:28 字數 1274 閱讀 8556

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...