1. 程式人生 > >class檔案結構[4]

class檔案結構[4]

【參考連結】

通過gclasslib來粗略講解一下.class檔案的整體結構

整體結構如下所示


以如下原始碼為例

 Java Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

package com.test.a;

@Deprecated
publicclass Test extends TestParent{
    
    
privatedouble m1=100d;
    
    
publicstaticfinaldouble m2=200d;
    
    
publicvoid method1(double

 arg1) throws RuntimeException{
        
int v1=0;
        
        
try{
            
this.m1=arg1;
        }
catch(IllegalStateException e){
            System.out.println(e.toString());
        }
        
    }
}

magic

4個位元組稱為magic(魔數),統一為0xCAFEBABE(諧音cafe baby)。

version

接下來4個位元組為minor versionmajorversion

。如圖表示是使用JDK1.8編譯生成的。

 

constant pool

常量池前面已經詳細講過,這裡不在敘述

 

access_flags

標誌名

標誌值

標誌含義

適用物件

ACC_PUBLIC

0x0001

0000 0000 0000 0001

public型別

類、介面、列舉、註解

ACC_FINAL

0x0010

0000 0000 0001 0000

final型別

ACC_SUPER

0x0020

0000 0000 0010 0000

使用新的invokespecial語義

類、介面

ACC_INTERFACE

0x0200

0000 0010 0000 0000

介面型別

介面

ACC_ABSTRACT

0x0400

abstract

型別

類、介面

ACC_SYNTHETIC

0x1000

該類不由使用者程式碼生成

類、介面、列舉、註解

ACC_ANNOTATION 

0x2000

註解型別

註解

ACC_ENUM  

0x4000

列舉型別

列舉

 

this

super

interfaces

fields

m1


m2

 

methods

<init>

method1


attributes

通用

Deprecated

Class上的Deprecated屬性為例


Synthetic

Class

SourceFile


InnerClasses

Field

ConstantValue

如前文所述,static final型別常量會有ConstantValue屬性,用於在準備階段設定值

 

Method

method1()方法為例

Exceptions

這個Exceptions屬性是在方法上throw的,下面的是在方法中try/catch/throw


Code

Minor version應該是Maxinum stack depth,表示運算元棧的最大深度是3

Maximum local variables表示區域性變量表佔用的總空間大小是5 個槽位

 

位元組碼指令如下


方法中的異常表如下


Code屬性還還含有子屬性,用於進一步儲存一些額外資訊

LineNumberTable

用於記錄位元組碼指令的偏移量和行號之間的對應關係


LocalVariableTable

區域性變量表,共有4個形式引數+區域性變數

index表示區域性變數佔用的槽位的位置

其中double型別arg1佔用的是1~2槽位,其餘各佔1個槽位。共5個槽位,跟Code中的Maximum local variables一致