一、概述
在class文件中,屬性表集合包括Java虛擬機預先規範定義的屬性以及用戶自定義的屬性,對於用戶自定義的屬性,虛擬機加載的時候會自動忽略掉。class文件、字段表、方法表都可以攜帶自己的屬性表集合,便於描述某些場景專有的信息。
二、組成
虛擬機中預定義的屬性有:
屬性名稱 | 使用位置 | 含義 |
Code | 方法表 | Java代碼編譯成的字節碼指令 |
ConstantValue | 字段表 | final關鍵字定義的常量池 |
Deprecated | 類,方法,字段表 | 被聲明爲deprecated的方法和字段 |
Exceptions | 方法表 | 方法拋出的異常 |
EnclosingMethod | 類文件 | 僅當一個類爲局部類或者匿名類是才能擁有這個屬性,這個屬性用於標識這個類所在的外圍方法 |
InnerClass | 類文件 | 內部類列表 |
LineNumberTable | Code屬性 | Java源碼的行號與字節碼指令的對應關係 |
LocalVariableTable | Code屬性 | 方法的局部便狼描述 |
StackMapTable | Code屬性 | JDK1.6中新增的屬性,供新的類型檢查檢驗器檢查和處理目標方法的局部變量和操作數有所需要的類是否匹配 |
Signature | 類,方法表,字段表 | 用於支持泛型情況下的方法簽名 |
SourceFile | 類文件 | 記錄源文件名稱 |
SourceDebugExtension | 類文件 | 用於存儲額外的調試信息 |
Synthetic | 類,方法表,字段表 | 標誌方法或字段爲編譯器自動生成的 |
LocalVariableTypeTable | 類 | 使用特徵簽名代替描述符,是爲了引入泛型語法之後能描述泛型參數化類型而添加 |
RuntimeVisibleAnnotations | 類,方法表,字段表 | 爲動態註解提供支持 |
RuntimeInvisibleAnnotations | 表,方法表,字段表 | 用於指明哪些註解是運行時不可見的 |
RuntimeVisibleParameterAnnotation | 方法表 | 作用與RuntimeVisibleAnnotations屬性類似,只不過作用對象爲方法 |
RuntimeInvisibleParameterAnnotation | 方法表 | 作用與RuntimeInvisibleAnnotations屬性類似,作用對象哪個爲方法參數 |
AnnotationDefault | 方法表 | 用於記錄註解類元素的默認值 |
BootstrapMethods | 類文件 | 用於保存invokeddynamic指令引用的引導方式限定符 |
屬性表的結構attribute_info
attribute_info{
attribute_name_index//屬性的名稱索引(指向常量池)2個字節
attribute_length//屬性長度 4個字節
info//有attribute_length個字節屬性值
}
三、常見屬性介紹
Code屬性
Exceptions屬性
LineNumberTable屬性
LocalVariableTable屬性
SourceFile屬性
ConstantValue屬性
InnerClass屬性
屬性表這部分內容比較多,也比較複雜,暫時先記錄到這裏。
參考資料: