Docker 的優點
840
2025-04-02
目錄
1、如何看字節碼
2、一個簡單的例子
3、字節碼結構
4、總結:
引言:都知道java的源文件最后會被編譯成class文件,class文件的內容是字節碼。為什么java要編譯成字節碼吶?我覺得最主要的原因是Java想要做到的跨平臺。只要有虛擬機,在任何平臺的表現都一樣的,屏蔽了系統層的不同,并且不像C,C++ 等語言編譯成和平臺相關的機器碼。同時也給其他的語言提供了在虛擬機運行的機會,只要是符合規范的class文件,不管是什么語言編譯出來的都可以。比如scala,kotlin等等。
1、如何看字節碼
原生的字節碼看起來實在費勁,讓我想起了匯編,記不住太多的指令,有沒有什么好的方式能既學習下字節碼,也不至于勸退吶。?idea 自帶的字節碼工具能完美解決這個問題。怎么用吶?
創建Java文件,并且編譯后,選中文件后,點view -> Show ByteCode。彈出字節碼文件。
2、一個簡單的例子
首先看下java源碼。一個非常簡單的只有一個屬性,兩個方法的類。
來吧,一起看下字節碼這個損色。請快速的掃過,不必深究細節,因為下面我會一行一行的解釋。
// class version 52.0 (52)
// access flags 0x21
public class org/pdool/d20200923/GamWatcher {
// compiled from: GamWatcher.java
// access flags 0x0
I age
// access flags 0x1
public
L0
LINENUMBER 6 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.
RETURN
L1
LOCALVARIABLE this Lorg/pdool/d20200923/GamWatcher; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public getAge()I
L0
LINENUMBER 9 L0
ALOAD 0
GETFIELD org/pdool/d20200923/GamWatcher.age : I
IRETURN
L1
LOCALVARIABLE this Lorg/pdool/d20200923/GamWatcher; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public setAge(I)V
L0
LINENUMBER 12 L0
ALOAD 0
ILOAD 1
PUTFIELD org/pdool/d20200923/GamWatcher.age : I
L1
LINENUMBER 13 L1
RETURN
L2
LOCALVARIABLE this Lorg/pdool/d20200923/GamWatcher; L0 L2 0
LOCALVARIABLE age I L0 L2 1
MAXSTACK = 2
MAXLOCALS = 2
}
3、字節碼結構
可真嚇人,獨坐敬亭山,相看兩討厭,看不懂啊。下面一起讀一下。幾乎都注釋了,應該看得懂吧。
一個最簡單的字節碼文件就是這樣,看起來似乎不難,所有的單詞也都認識,大概猜一下也能理解。既然有概念了,下面就列舉一下,對著字節碼讀一下也就大概懂了。
方法調用指令。
4、總結:關注我公眾號【香菜聊游戲】
字節碼指令很多,我們也沒必要全部都懂,都能記住,只要在需要查看的時候能根據文檔讀明白,理解其中的含義,知道class的文件結構,畢竟我們是面向開發,不是面向研究,知其然知其所以然夠了,不用花太多的精力在上面。加油哦。
寫文章不容易,求轉發,關注我的公眾號【香菜聊游戲】,說不定會有驚喜哦。
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。