1. 程式人生 > 實用技巧 >深入Class檔案結構

深入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檔案中