【我的ASM學習進階之旅】 08 介紹ASM的Core API 的Methods

從本篇博客開始介紹如何使用核心ASM API生成和轉換編譯方法。
首先介紹了已編譯的方法,然後提供了許多說明性示例,介紹了相應的ASM接口,組件以及生成和轉換它們的工具。

一、結構體(Structure)

在已編譯的類中,方法的代碼存儲爲一系列字節碼指令。 爲了生成和轉換類,瞭解這些指令並理解其工作原理至關重要。 本節概述了這些說明,這些說明應足以開始對簡單類生成器和轉換器進行編碼。 要獲得完整的定義,您應該閱讀Java虛擬機規範。

1.1 執行模式 (Execution model)

在呈現字節碼指令之前,必須呈現Java虛擬機執行模型。 如您所知,Java代碼是在線程內部執行的。 每個線程都有其自己的執行堆棧,該堆棧由幀組成。

每個幀代表一個方法調用:每次調用一個方法時,都會在當前線程的執行堆棧上推送一個新幀。

當方法返回時,無論是正常還是由於異常,都會從執行堆棧中彈出該幀,並在調用方法中繼續執行(其幀現在位於堆棧的頂部)

每幀包含兩部分:局部變量部分和操作數堆棧部分。
局部變量部分包含可由其索引以隨機順序訪問的變量。 顧名思義,操作數堆棧部分是一堆值,這些值被字節碼指令用作操作數。 這意味着只能以後進先出的順序訪問此堆棧中的值。 不要混淆操作數棧和線程的執行棧:執行棧中的每一幀都包含自己的操作數棧。

局部變量和操作數堆棧部分的大小取決於方法的代碼。 它在編譯時計算,並與字節碼指令一起存儲在已編譯的類中。 結果,與給定方法的調用相對應的所有幀都具有相同的大小,但是與不同方法相對應的幀的局部變量和操作數堆棧部分可以具有不同的大小。

下圖顯示了一個包含3幀的示例執行堆棧。

  • 第一幀包含3個局部變量,其操作數堆棧的最大大小爲4,並且包含兩個值。
  • 第二幀在其操作數堆棧中包含2個局部變量和兩個值。
  • 最後,在執行堆棧頂部的第三幀包含4個局部變量和兩個操作數。
    在這裏插入圖片描述

創建框架後,將使用空堆棧初始化框架,並使用目標對象this(對於非靜態方法)和方法的參數初始化其局部變量。 例如,調用方法a.equals(b)創建一個具有空堆棧的框架,並將前兩個局部變量初始化爲a和b(其他局部變量未初始化)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章