字節碼文件簡單分析

caohao@caohaodeMacBook-Pro main % javap -verbose com.nettylearn.Service.parent2
Classfile 類文件 /Users/caohao/IdeaProjects/nettylearn/build/classes/java/main/com/nettylearn/Service/parent2.class。 文件路徑
Last modified 2020-5-16; size 626 bytes 最後一次修改,大小爲626字節
MD5 checksum 568c7193f190c9b40ffdc717cd68a0d4 校驗和,再計算機網絡裏學的那個在傳輸層的檢錯方法和檢驗
Compiled from “calssloadingtest2.java” 由那個類編譯過來的
class com.nettylearn.Service.parent2 全類名
minor version: 0 主版本號
major version: 52。 次版本號
flags: ACC_SUPER
Constant pool: 常量池
#1 = Methodref #8.#22 // java/lang/Object.""😦)V 一個方法,描述索引爲8和22
#2 = Fieldref #23.#24 // java/lang/System.out:Ljava/io/PrintStream; 一個字段
#3 = String #25 // parent method string類型索引25
#4 = Methodref #26.#27 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = String #28 // parent static block
#6 = Fieldref #7.#29 // com/nettylearn/Service/parent2.a:I
#7 = Class #30 // com/nettylearn/Service/parent2
#8 = Class #31 // java/lang/Object
#9 = Utf8 a
#10 = Utf8 I
#11 = Utf8
#12 = Utf8 ()V
#13 = Utf8 Code
#14 = Utf8 LineNumberTable
#15 = Utf8 LocalVariableTable
#16 = Utf8 this
#17 = Utf8 Lcom/nettylearn/Service/parent2;
#18 = Utf8 get
#19 = Utf8
#20 = Utf8 SourceFile
#21 = Utf8 calssloadingtest2.java
#22 = NameAndType #11:#12 // “”😦)V
#23 = Class #32 // java/lang/System
#24 = NameAndType #33:#34 // out:Ljava/io/PrintStream;
#25 = Utf8 parent method
#26 = Class #35 // java/io/PrintStream
#27 = NameAndType #36:#37 // println:(Ljava/lang/String;)V
#28 = Utf8 parent static block
#29 = NameAndType #9:#10 // a:I
#30 = Utf8 com/nettylearn/Service/parent2
#31 = Utf8 java/lang/Object
#32 = Utf8 java/lang/System
#33 = Utf8 out
#34 = Utf8 Ljava/io/PrintStream;
#35 = Utf8 java/io/PrintStream
#36 = Utf8 println
#37 = Utf8 (Ljava/lang/String;)V
{
public static int a;
descriptor: I
flags: ACC_PUBLIC, ACC_STATIC

com.nettylearn.Service.parent2();
descriptor: ()V
flags:
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object.""😦)V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/nettylearn/Service/parent2;

public static void get();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String parent method
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 9: 0
line 10: 8

static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #5 // String parent static block
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: iconst_1
9: putstatic #6 // Field a:I
12: return
LineNumberTable:
line 5: 0
line 7: 8
}
SourceFile: “calssloadingtest2.java”

先拿第一個常量分析一下, #1 = Methodref #8.#22 // java/lang/Object.""😦)V

我們可以看到它是一個方法,描述索引8和22

#8 = Class #31 // java/lang/Object

#31 = Utf8 java/lang/Object

#22 = NameAndType #11:#12 // “”😦)V 名字和類型這個//後面的是系統幫助我們翻譯過來的,在字節碼文件中沒有這幾個的16進制數據

#11 = Utf8 。這是一個構造方法

#12 = Utf8 ()V。返回值爲空

其實我們通過反編譯回來的助記符文件是十分好理解的,而真正的16進展字節碼文件也是十分的有條理,和這個差不多。

#2 = Fieldref #23.#24 // java/lang/System.out:Ljava/io/PrintStream;

我們看看這個系統幫我們翻譯過來的描述,這是一個來自於system.out的方法(l表示對象)參數是java.io.printstream

在常量池下面的{裏面則是方法順序執行的操作描述}

com.nettylearn.Service.parent2();
descriptor: ()V
flags:
Code:
stack=1, locals=1, args_size=1。
0: aload_0
1: invokespecial #1 // Method java/lang/Object.""😦)V
4: return
LineNumberTable: 操作數表
line 3: 0
LocalVariableTable: 本地變量表
Start Length Slot Name Signature
0 5 0 this Lcom/nettylearn/Service/parent2;

其實我們看也能看出個大概這是一個方法如果執行這個方法就會到方法區這邊來找這個類對象加載這個方法然後到線程獨享的區域執行,在虛擬機棧中。

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