17.字節碼中方法內部結構分析-Jclasslib的使用

1.使用Jclasslib分析字節碼中的方法內部結構

1.安裝jclasslib bytecode viewer。進入https://github.com/ingokegel/jclasslib下載最新版的Jclasslib並且安裝。
2.編譯下面的java代碼,生成LocalVariablesTest .class文件。

package jvm;

import java.util.Date;

public class LocalVariablesTest {
    private int count = 0;
    public static void main(String[] args) {
        LocalVariablesTest test = new LocalVariablesTest();
        int num = 10;
    }

    //練習:
    public static void testStatic(){
        LocalVariablesTest test = new LocalVariablesTest();
        Date date = new Date();
        int count = 10;
        System.out.println(count);
        //因爲this變量不存在於當前方法的局部變量表中!!
//        System.out.println(this.count);
    }
}

3.使用安裝好的jclasslib 打開LocalVariablesTest .class。
在這裏插入圖片描述
4.字節碼方法內部結構分析
4.1: 如下圖所示,找到Methods並且展開,裏面包含了java文件中定義的所有的方法。<init>對應着構造方法。選中main方法。
Name:方法名
Description:描述了方法的參數類型以及返回值類型。比如<([Ljava/lang/String;)V>,說明參數類型是Ljava/lang/String;返回值類型是V,表示的是void類型。
Access flags:訪問標識。public static。
在這裏插入圖片描述
4.2:進一步展開main方法。選中Code

a) Bytecode:字節碼指令。java方法對應的字節碼指令。
在這裏插入圖片描述
b) Exception table:方法拋出的異常。由於main方法沒有拋出異常,所以什麼都沒有。
在這裏插入圖片描述
c) Misc裏面包含了一些描述信息。
Maximum local variables:局部變量表最大的長度。當前例子爲3。
Code length:code的length。指的是 Bytecode字節碼指令中的行數。例子中是0-11,所以是12行。
在這裏插入圖片描述
4.3:進一步選中LineNumberTable:行號表。表示的是字節碼的指令行號與java文件中的代碼的行號的對應關係。
例如圖中的Start PC列8和Line Number列的9對應。表示的是字節碼指令的第8行對應的是java代碼的第9行。
在這裏插入圖片描述
4.4:進一步選中LocalVariablesTable:局部變量表。
Start PC:字節碼指令行號,表示的是變量聲明的起始位置。
Length:變量作用域範圍。從起始位置開始,變量可用的行長度。例如圖中的Start PC列8和Length列的4,表示的是test變量從字節碼指令的第8行開始聲明,可用的行長度爲4,也就是8-11這4行可以使用。(切換Jclasslib的視圖到code->Bytecode便於理解)。
Index:索引。jvm通過索引使用局部變量。
Name:局部變量的名稱。
Descriptor:描述局部變量的類型。I表示的是int。
在這裏插入圖片描述

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