首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Class 文件屬性表詳解:SourceFile、InnerClasses、Synthetic、ConstantValue、Deprecated

     編輯:Java 相關知識

Java Class 文件屬性表核心屬性完整解析

Class 文件方法表之後為屬性表(attributes_count + attributes[]),屬性可出現於 ClassFile、field_info、method_info、Code 屬性等多個層級。本文系統講解 5 個核心屬性的結構、編碼規則與實際反編譯驗證。

屬性通用格式

屬性通用格式

  • attribute_name_index (u2):指向常量池 CONSTANT_Utf8_info(屬性名)
  • attribute_length (u4):屬性數據長度(不含前 6 字節)
  • info[]:具體屬性數據,長度由 attribute_length 決定

SourceFile 屬性:源文件名記錄

SourceFile屬性結構

  • 位於 ClassFile 屬性表
  • sourcefile_index (u2):指向常量池 Utf8(源文件名,不含路徑)
  • 僅一條記錄,attribute_length = 2

反編譯驗證:

SourceFile: "Person.java"
Constant pool:
#20 = Utf8 SourceFile
#21 = Utf8 Person.java

SourceFile屬性示意圖

InnerClasses 屬性:內部類與外部類關係

InnerClasses屬性結構

  • 位於 ClassFile 屬性表
  • number_of_classes (u2):內部類數量
  • classes[]:每項為 inner_class_info(4 個 u2 索引)

inner_class_info 結構:

inner_class_info結構

  • inner_class_info_index:內部類 Class 索引
  • outer_class_info_index:外部類 Class 索引(0 表示無)
  • inner_name_index:內部類簡單名(Utf8,匿名類為 0)
  • inner_class_access_flags:內部類訪問標志

雙向約束:外部類必須列舉所有內部類;內部類必須指向外部類。多層嵌套遞歸記錄。

Synthetic 屬性:編譯器生成標記

Synthetic屬性結構

  • 可現於 ClassFile、field_info、method_info
  • 無 info 數據(attribute_length = 0),純標志位
  • 標記:非源碼顯式定義,由編譯器自動生成

典型場景:

  • 內部類持有外部類引用的合成字段
  • 無構造方法類的默認無參構造器 <init>
  • 靜態初始化塊對應的 <clinit> 方法
  • 動態代理、Lambda 表達式生成的類/方法

注意:屬性可選,某些編譯器版本可能不生成。

ConstantValue 屬性:靜態常量編譯期賦值

ConstantValue屬性結構

  • 僅現於 field_info(字段屬性表)
  • 限制:必須為 static 字段(final 可選)
  • constantvalue_index (u2):指向常量池字面量項

常量池項類型映射:

字段類型常量池項類型
byte/short/char/boolean/intCONSTANT_Integer_info
longCONSTANT_Long_info
floatCONSTANT_Float_info
doubleCONSTANT_Double_info
StringCONSTANT_String_info

JVM 執行語義:若使用 ConstantValue,賦值動作發生在 <clinit> 執行之前(類加載準備階段)。

反編譯驗證:

static final int a = 1;
Constant pool:
#7 = Utf8 ConstantValue
#8 = Integer 1
ConstantValue: int 1

ConstantValue屬性示意圖

Deprecated 屬性:棄用標記

Deprecated屬性結構

  • 可現於 ClassFile、field_info、method_info
  • attribute_length = 0,純標志
  • 對應源碼 @Deprecated 註解

反編譯驗證:

@Deprecated int getAge() { ... }
Constant pool:
#18 = Utf8 Deprecated
flags: Deprecated: true

Deprecated屬性示意圖

總結

屬性表採用統一自描述格式(名稱索引+長度+數據),支援層級化出現(Class/字段/方法/Code),實現了元數據的靈活擴展。掌握核心屬性結構,是構建字節碼分析工具、理解編譯器行為、診斷類加載異常的關鍵基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved