Java Class文件解析

一、描述

  Class文件是一组以8位(1字节)为基础单位的二进制流。

  当数据项大于8位时,按照【高位在前】分割成若干个8位进行存储。

  按照Java虚拟机规范的规定,Class文件结构只有两种数据类型:无符号数和表

二、无符号数

  无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1字节,2字节,4字节,8字节的无符号数。

  无符号数可用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

三、表

类型名字名称数量描述
u4magic魔数1Class文件1-4字节,是否能被JVM接受,更加安全
u2minor_version次版本号1Class文件5-6字节
u2major_version主版本号1Class文件7-8字节(52对应JDK1.8)
u2constant_pool_count常量池大小1从1开始,第0项常量为空:不引用任何一个常量池项目
cp_infoconstant_pool常量池constant_pool_count - 1

字面量:字符串、常量值等

符号引用:类和接口的全限定名;字段名称和描述符;方法名称和描述符

u2access_flag类访问标志1ACC_PUBLIC
u2this_class类索引1确定类的全限定名
u2super_class父类索引1确定类的父类的全限定名(除Object,所有类的父类索引不为0)
u2interfaces_count接口数量1确定接口数量
u2interfaces接口索引集合interfaces_count确定类实现了那些接口;如果数量为0,则不占用任何字节
u2fields_count字段数量1确定字段数量
field_infofields字段集合fields_count描述接口或类中声明的表量;类变量、实例表量
u2methods_count方法数量1确定方法数量
method_infomethods方法集合methods_count描述接口或者类中方法
u2attributes_count属性数量1确定属性数量
attribute_infoattributes属性集合attributes_count描述属性

3.1 常量池项目

常量项目类型描述
CONSTANT_Utf8_infotagu11
lengthu2字符串字节数(UTF-8编码)
bytesu1字符串(UTF-8编码)
CONSTANT_Integer_infotagu13
bytesu4int(高位在前)
CONSTANT_Float_infotagu14
bytesu4float(高位在前)
CONSTANT_Long_infotagu15
bytesu8long(高位在前)
CONSTANT_Double_infotagu16
bytesu8double(高位在前)
CONSTANT_Class_infotagu17
indexu2指向全限定名常量项的索引(CONSTANT_Utf8_info)
CONSTANT_String_infotagu18
indexu2指向字符串字面量的索引(CONSTANT_Utf8_info)
CONSTANT_Fieldref_infotagu19
indexu2指向声明字段的类或接口描述符的索引(CONSTANT_Class_info)
indexu2指向字段描述符的索引(CONSTATN_NameAndType_info)
CONSTANT_Methodref_infotagu110
indexu2指向声明方法的类描述符的索引(CONSTANT_Class_info)
indexu2指向方法的名称及类型描述符的索引(CONSTANT_NameAndType_info)
CONSTANT_InterfaceMethodref_infotagu111
indexu2指向声明方法的接口描述符的索引(CONSTANT_Class_info)
indexu2指向方法的名称及类型描述符的索引(CONSTANT_NameAndType_info)
CONSTANT_NameAndType_infotagu112
indexu2指向字段或方法名称常量项的索引(CONSTANT_Utf8_info)
indexu2指向字段或方法描述符常量项的索引(CONSTANT_Utf8_info)
CONTANT_MethodHandle_infotagu115
reference_kindu11-9;决定方法句柄类型;标识方法句柄的字节码行为
reference_indexu2对常量池的有效索引
CONSTANT_MethodType_infotagu116
descriptor_indexu2对常量池的有效索引,方法的描述符(CONSTANT_Utf8_info)
CONSTANT_InvokeDynamic_infotagu118

bootstrap_method

_attr_index

u2对当前Class文件中引导方法的bootstrap_methods[]数组的索引

name_and_type_

index

u2

对当前常量池的有效索引,方法名称和方法描述符

(CONSTANT_NameAndType_info)

 

3.2 描述符标识字段含义

标识字符含义
B基本数据类型(byte)
C基本数据类型(char)
D基本数据类型(double)
F基本数据类型(float)
I基本数据类型(int)
J基本数据类型(long)
S基本数据类型(short)
Z基本数据类型(boolean)
V特殊类型(void)
L对象类型(Ljava/lang/Object)([[Ljava/lang/Object)

 

3.3类访问标志

标志名称标志值含义
ACC_PUBLIC0x0001是否是public类型
ACC_FINAL0x0010是否是final类型(类)
ACC_SUPER0x0020

是否允许使用invokespecial字节码指令的新语意

(JDK 1.0.2之后编译出来的类为真)

ACC_INTERFACE0x0200标识接口
ACC_ABSTRACT0x0400是否是abstract类型(接口和抽象类为真)
ACC_SYNTHETIC0x1000标识类不由用户生成
ACC_ANNOTATION0x2000标识注解
ACC_ENUM0x4000标识枚举

3.4.1 字段表集合

类型名称数量备注
u2access_flags1字段访问标志
u2name_index1字段简单名称(CONSTANT_Utf8_info)
u2descriptor_index1字段的描述符(CONSTANT_Utf8_info)
u2attributes_count1属性数量
attribute_infoattributesattributes_count字段访问标志的集合

3.4.2 字段访问标志

标志名称标志值含义
ACC_PUBLIC0x0001字段是否public
ACC_PRIVATE0x0002字段是否private
ACC_PROTECTED0x0004字段是否protected
ACC_STATIC0x0008字段是否static
ACC_FINAL0x0010字段是否final
ACC_VOLATILE0x0040字段是否volatile
ACC_TRANSIENT0x0080字段是否transient
ACC_SYNTHEIC0x1000字段是否由编译器自动产生
ACC_ENUM0x4000字段是否enum

3.5.1 方法表集合

类型名称数量备注
u2access_flags1方法访问标志(ACC_PUBLIC)
u2name_index1方法简单名称(CONSTANT_Utf8_info)
u2desciptor_index1方法的描述符(CONSTANT_Utf8_info)
u2attributes_count1属性数量
attribute_infoattributesattributes_count属性集合

3.5.2 方法访问标志

标志名称标志值含义
ACC_PUBLIC0x0001方法是否public
ACC_PRIVATE0x0002方法是否private
ACC_PROTECTED0x0004方法是否protected
ACC_STATIC0x0008方法是否static
ACC_FINAL0x0010方法是否final
ACC_SYNCHRONIZED0x0020方法是否synchronized
ACC_BRIDGE0x0040方法是否由编译器产生的桥接方法
ACC_VARARGE0x0080方法是否接受不定参数
ACC_NATIVE0x0100方法是否native
ACC_ABSTRACT0x0400方法是否abstract
ACC_STRICTFP0x0800方法是否strictfp
ACC_SYNTHETIC0x1000方法是否由编译器自动产生

3.6 属性表

3.6.1 Code属性

类型名称数量备注
u2attribute_name_index1属性名称索引(CONSTANT_Utf8_info)
u4attribute_length1属性长度
u2max_stack1 
u2max_locals1 
u4code_length1 
u1codecode_length 
u2exception_table_length1 
exception_infoexception_tableexception_table_length 
u2attributes_count1 
attribute_infoattributesattributes_count 

 

3.6.2 Exception

类型名称数量备注
u2attribute_name_index1 
u4attribute_length1 
u2number_of_exceptions1异常数量
u2exception_index_tablenumber_of_exception异常(CONSTANT_Class_info)

 

 

Java Class文件格式、常量池项目的类型、表的结构

转载于:https://www.cnblogs.com/pascall/p/11097760.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值