深入Class檔案結構
方法的位元組碼
構造方法的位元組碼:public <init> ()V
這是一個公有的無參構造方法,返回值型別是"V"(也就是void,很奇怪,構造方法明明沒有返回值,還使用V表示),"
main方法的位元組碼:public static main([Ljava/lang/String;)V
它的引數是一個String型別的陣列,其中"["表示陣列,而"L"表示一個類形式而不是基本資料型別(如int, long等),方式"L"表示的類後面都會以";"結尾,表示這個類的結束
class檔案頭資訊
位元組碼檔案的前4個位元組是一個32位的無符號整型,“cafebabe”是這個整數的16進製表示形式。如果一個class檔案的前4的位元組是這個數字,則表示這個檔案是一個class檔案,否則JVM就認為這不是class檔案,也不會載入
接著兩個位元組表示最大的版本號和最小的版本號,從最初的Java到Java8的版本範圍是45.3~53.0
magic = ca fe ba be
minor version = 0 # 最小版本
major version = 53 # 最大版本
也就是說前6個位元組表示這個class檔案的基本頭資訊,JVM在載入這個class檔案時會檢查是否符合這個條件
類可以使用的修飾符
普通類(外部類):public default abstract final
內部類:
- 成員內部類:public default protected private abstract final
- 區域性內部類:default abstract final
- 靜態內部類:public default protected private abstract final
總結:default,final時所有類型別都可以使用的;除了區域性內部類,public是所有類型別都可以使用的;靜態內部類,成員內部類作為內部類的兩種形式可以使用所有的訪問修飾符和abstract,final
只有外部類和靜態內部類可以有main方法(psvm),所以這兩種類型別可以執行main方法
方法總長度和行數限制
Java中一個方法編譯後的位元組碼最長是2^32 個位元組,也就是4GB的程式碼長度,但是由於行數的限制(行數長度只有兩個位元組2^16),實際上整個Java原始碼的長度只有64KB,這裡不是說Java原始碼只能有64K,而是編譯後的位元組碼長度不能超過64K
一個Java原始碼中的行總數最多隻能有65536行,而位元組碼的總位元組數也只能有65536個
64KB = 65536B/1024
Javap生成class檔案的方式
通過Javap生成class檔案命令如下
javap -verbose Message>message.txt
表示輸出Message類的class資訊到message.txt檔案中