Android學習筆記 手動執(zhí)行Java字節(jié)碼

Android學習筆記 手動執(zhí)行Java字節(jié)碼

@[Android, 字節(jié)碼]

背景

這一次是玩安卓知識星球的第二期作業(yè)(分析每一行字節(jié)碼執(zhí)行過程中的本地變量數(shù)組和操作數(shù)棧的狀態(tài))岂丘,完成第一期作業(yè)的過程中需要需要操作字節(jié)碼,但借助Javassist的幫助也沒有去學習字節(jié)碼的相關知識,現(xiàn)在不得不好好的看看Java的字節(jié)碼究竟是怎樣執(zhí)行的渤滞。

JVM的內存模型

首先復習一下JVM的內存模型 ,JVM的內存模型分為幾個區(qū)域,如下圖:


JVM的內存模型.jpg
  • 程序計數(shù)器:這是線程私有的數(shù)據(jù)區(qū)厨相,用來表示當前執(zhí)行的是哪一行的指令
  • 虛擬機棧:一個棧結構,存儲的元素被稱為棧幀鸥鹉,每個棧幀包含了一個方法的數(shù)據(jù)和部分過程結果的區(qū)域蛮穿,同時包含動態(tài)連接的信息和方法返回值
    • 局部變量表:用來保存方法局部變量的數(shù)組結構
    • 操作數(shù)棧:JVM是基于棧結構,操作數(shù)棧就是具體用輔助執(zhí)行指令的棧毁渗,棧深度在編譯期就寫入到class文件中
    • 動態(tài)鏈接:作用是將對方法符號引用轉換為直接引用
    • 返回地址:方法執(zhí)行完成后返回的位置践磅,即調用自己的位置
  • 本地方法棧:跟虛擬機棧類似的為本地方法服務的棧結構
  • 方法區(qū):線程共享的區(qū)域,存儲運行時常量池灸异,方法的字節(jié)碼數(shù)據(jù)府适,類的字段等
  • 堆:也是線程共享的區(qū)域,存儲的是Java動態(tài)生成的對象數(shù)據(jù)肺樟,垃圾回收器管理的也是這的區(qū)域

class文件

對JVM內存模型有了個簡單的回顧檐春,我們繼續(xù)看看class文件的結構是怎么樣的。


1986868-5b44e95ff7e30847.jpeg
  1. 魔數(shù)和版本號都是對文件本身的描述
  2. 常量池:存儲的是字面量和符號引用么伯,除了對一些基本類型的操作疟暖,像是類名、方法名田柔、常量等都在這里有定義
  3. 訪問標記:標記class是表示一個類還是一個接口俐巴,是否公開,是否是abstract等信息
  4. 類索引:引用常量池中的類的全限定類名
  5. 父類索引:引用常量池中的父類的全限定類名
  6. 接口索引:接口數(shù)量和引用常量池中的接口的全限定接口名
  7. 字段表集合:定義類所有字段的各種屬性
  8. 方法:包含每個方法的各種屬性硬爆,其中就包括上面說到的操作數(shù)棧的深度
  9. 屬性:定義了class文件的屬性欣舵,比如源代碼文件名

手動執(zhí)行字節(jié)碼指令

接下來結合代碼,我們來手動執(zhí)行字節(jié)碼指令:

public class Hello {
    public static void main(String[] args) {
        int a = 1;
        int b = 10;
        String c = "abc";
        System.out.println(a + b + c + get3());
    }

    private static int get3() {
        int result = 0;
        for (int i = 0; i < 3; i++) {
            result ++;
        }
        return result;
    }
}

// 生成的字節(jié)碼指令
// main()
 0 iconst_1
 1 istore_1
 2 bipush 10
 4 istore_2
 5 ldc #2 <abc>
 7 astore_3
 8 getstatic #3 <java/lang/System.out>
11 new #4 <java/lang/StringBuilder>
14 dup
15 invokespecial #5 <java/lang/StringBuilder.<init>>
18 iload_1
19 iload_2
20 iadd
21 invokevirtual #6 <java/lang/StringBuilder.append>
24 aload_3
25 invokevirtual #7 <java/lang/StringBuilder.append>
28 invokestatic #8 <com/zhixiao/readclass/Hello.get3>
31 invokevirtual #6 <java/lang/StringBuilder.append>
34 invokevirtual #9 <java/lang/StringBuilder.toString>
37 invokevirtual #10 <java/io/PrintStream.println>
40 return

// get3()
 0 iconst_0
 1 istore_0
 2 iconst_0
 3 istore_1
 4 iload_1
 5 iconst_3
 6 if_icmpge 18 (+12)
 9 iinc 0 by 1
12 iinc 1 by 1
15 goto 4 (-11)
18 iload_0
19 ireturn

代碼很簡單缀磕,我們先來看以下各部分在虛擬機中的存儲情況


Java字節(jié)碼總覽 | center

代碼加載到方法區(qū)缘圈,正在被執(zhí)行的方法作為棧幀被初始化到虛擬機棧,執(zhí)行第一條指令虐骑,常量1被壓入棧


1576237431800.png

new對象時准验,在堆生成該對象,并將對象的地址壓入棧
1576237550745.png

執(zhí)行方法時廷没,調用方法生成新的棧幀并壓入虛擬機棧,然后將返回值設為方法調用處的下一條指令


1576237607977.png

退出方法時從返回地址返回垂寥,如果有返回值則將棧頂?shù)闹祲喝胝{用處的操作數(shù)棧
1576237726715.png

以上只是部分分析過程颠黎,具體可以下載我做的ppt查看全部的過程會更清楚
class執(zhí)行過程.gif

ppt的地址:

鏈接:https://pan.baidu.com/s/11SDZbSAiiEGtlg5wZi1ztw
提取碼:np8f

總結

將學習的結果寫出來真的花時間花精力另锋,但是我相信通過這樣的方式我會對所學的內容理解更加深刻。現(xiàn)在希望能繼續(xù)堅持下去狭归∝财海可以參考項目地址

參考:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市过椎,隨后出現(xiàn)的幾起案子室梅,更是在濱河造成了極大的恐慌,老刑警劉巖疚宇,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亡鼠,死亡現(xiàn)場離奇詭異,居然都是意外死亡敷待,警方通過查閱死者的電腦和手機间涵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榜揖,“玉大人勾哩,你說我怎么就攤上這事【儆矗” “怎么了思劳?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妨猩。 經常有香客問我潜叛,道長,這世上最難降的妖魔是什么册赛? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任钠导,我火速辦了婚禮,結果婚禮上森瘪,老公的妹妹穿的比我還像新娘牡属。我一直安慰自己,他們只是感情好扼睬,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布逮栅。 她就那樣靜靜地躺著,像睡著了一般窗宇。 火紅的嫁衣襯著肌膚如雪措伐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天军俊,我揣著相機與錄音侥加,去河邊找鬼。 笑死粪躬,一個胖子當著我的面吹牛担败,可吹牛的內容都是我干的昔穴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼提前,長吁一口氣:“原來是場噩夢啊……” “哼吗货!你這毒婦竟也來了?” 一聲冷哼從身側響起狈网,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤宙搬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拓哺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勇垛,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年拓售,在試婚紗的時候發(fā)現(xiàn)自己被綠了窥摄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡础淤,死狀恐怖崭放,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鸽凶,我是刑警寧澤币砂,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站玻侥,受9級特大地震影響决摧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜凑兰,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一掌桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姑食,春花似錦波岛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至曹鸠,卻和暖如春煌茬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彻桃。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工坛善, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓浑吟,卻偏偏與公主長得像笙纤,于是被迫代替她去往敵國和親耗溜。 傳聞我的和親對象是個殘疾皇子组力,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容