目录
  • Class文件结构
    • 10.1. 属性计数器
    • 10.2. 属性表
    • 9.1. 方法计数器
    • 9.2. 方法表
    • 8.1. 字段计数器
    • 8.2. 字段表
    • 5.1. 常量池计数器
    • 5.2. 常量池表
    • 4.1. Class文件版本号对应关系
    • 1. Class字节码文件结构
    • 2. Class文件数据类型
    • 3. 魔数
    • 4. 文件版本号
    • 5. 常量池集合
    • 6. 访问标志
    • 7. 类索引、父类索引、接口索引
    • 8. 字段表集合
    • 9. 方法表集合
    • 10. 属性表集合


Class文件结构

1. Class字节码文件结构


类型名称说明长度数量
魔数u4magic魔数,识别Class文件格式4个字节1
版本号u2minor_version副版本号(小版本)2个字节1
u2major_version主版本号(大版本)2个字节1
常量池集合u2constant_pool_count常量池计数器2个字节1
cp_infoconstant_pool常量池表n个字节constant_pool_count - 1
访问标识u2access_flags访问标识2个字节1
索引集合u2this_class类索引2个字节1
u2super_class父类索引2个字节1
u2interfaces_count接口计数器2个字节1
u2interfaces接口索引集合2个字节interfaces_count
字段表集合u2fields_count字段计数器2个字节1
field_infofields字段表n个字节fields_count
方法表集合u2methods_count方法计数器2个字节1
method_infomethods方法表n个字节methods_count
属性表集合u2attributes_count属性计数器2个字节1
attribute_infoattributes属性表n个字节attributes_count

2. Class文件数据类型

数据类型定义说明
无符号数无符号数可以用来描述数字、索引引用、数量值或按照utf-8编码构成的字符串值。其中无符号数属于基本的数据类型。 以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节
表是由多个无符号数或其他表构成的复合数据结构。所有的表都以“_info”结尾。 由于表没有固定长度,所以通常会在其前面加上个数说明。

3. 魔数


4. 文件版本号

4.1. Class文件版本号对应关系

主版本(十进制)副版本(十进制)编译器版本
4531.1
4601.2
4701.3
4801.4
4901.5
5001.6
5101.7
5201.8
5301.9
5401.10
5501.11


5. 常量池集合

类型名称数量
u2(无符号数)constant_pool_count1
cp_info(表)constant_poolconstant_pool_count - 1

5.1. 常量池计数器

5.2. 常量池表

类型标志(或标识)描述
CONSTANT_Utf8_info1UTF-8编码的字符串
CONSTANT_Integer_info3整型字面量
CONSTANT_Float_info4浮点型字面量
CONSTANT_Long_info5长整型字面量
CONSTANT_Double_info6双精度浮点型字面量
CONSTANT_Class_info7类或接口的符号引用
CONSTANT_String_info8字符串类型字面量
CONSTANT_Fieldref_info9字段的符号引用
CONSTANT_Methodref_info10类中方法的符号引用
CONSTANT_InterfaceMethodref_info11接口中方法的符号引用
CONSTANT_NameAndType_info12字段或方法的符号引用
CONSTANT_MethodHandle_info15表示方法句柄
CONSTANT_MethodType_info16标志方法类型
CONSTANT_InvokeDynamic_info18表示一个动态方法调用点

标志符含义
B基本数据类型byte
C基本数据类型char
D基本数据类型double
F基本数据类型float
I基本数据类型int
J基本数据类型long
S基本数据类型short
Z基本数据类型boolean
V代表void类型
L对象类型,比如:Ljava/lang/Object;
[数组类型,代表一维数组。比如:`double[][][] is [[[D









6. 访问标志

标志名称标志值含义
ACC_PUBLIC0x0001标志为public类型
ACC_FINAL0x0010标志被声明为final,只有类可以设置
ACC_SUPER0x0020标志允许使用invokespecial字节码指令的新语义,JDK1.0.2之后编译出来的类的这个标志默认为真。(使用增强的方法调用父类方法)
ACC_INTERFACE0x0200标志这是一个接口
ACC_ABSTRACT0x0400是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假
ACC_SYNTHETIC0x1000标志此类并非由用户代码产生(即:由编译器产生的类,没有源码对应)
ACC_ANNOTATION0x2000标志这是一个注解
ACC_ENUM0x4000标志这是一个枚举



7. 类索引、父类索引、接口索引

长度含义
u2this_class
u2super_class
u2interfaces_count
u2interfaces[interfaces_count]


8. 字段表集合

8.1. 字段计数器

标志名称标志值含义数量
u2access_flags访问标志1
u2name_index字段名索引1
u2descriptor_index描述符索引1
u2attributes_count属性计数器1
attribute_infoattributes属性集合attributes_count

8.2. 字段表

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

标志符含义
B基本数据类型byte
C基本数据类型char
D基本数据类型double
F基本数据类型float
I基本数据类型int
J基本数据类型long
S基本数据类型short
Z基本数据类型boolean
V代表void类型
L对象类型,比如:Ljava/lang/Object;
[数组类型,代表一维数组。比如:`double[][][] is [[[D


9. 方法表集合

9.1. 方法计数器

9.2. 方法表

标志名称标志值含义数量
u2access_flags访问标志1
u2name_index方法名索引1
u2descriptor_index描述符索引1
u2attributes_count属性计数器1
attribute_infoattributes属性集合attributes_count

标志名称标志值含义
ACC_PUBLIC0x0001public,方法可以从包外访问
ACC_PRIVATE0x0002private,方法只能本类访问
ACC_PROTECTED0x0004protected,方法在自身和子类可以访问
ACC_STATIC0x0008static,静态方法

10. 属性表集合

10.1. 属性计数器

10.2. 属性表

类型名称数量含义
u2attribute_name_index1属性名索引
u4attribute_length1属性长度
u1infoattribute_length属性表

属性名称使用位置含义
Code方法表Java代码编译成的字节码指令
ConstantValue字段表final关键字定义的常量池
Deprecated类,方法,字段表被声明为deprecated的方法和字段
Exceptions方法表方法抛出的异常
EnclosingMethod类文件仅当一个类为局部类或者匿名类时才能拥有这个属性,这个属性用于标识这个类所在的外围方法
InnerClass类文件内部类列表
LineNumberTableCode属性Java源码的行号与字节码指令的对应关系
LocalVariableTableCode属性方法的局部变量描述
StackMapTableCode属性JDK1.6中新增的属性,供新的类型检查检验器和处理目标方法的局部变量和操作数有所需要的类是否匹配
Signature类,方法表,字段表用于支持泛型情况下的方法签名
SourceFile类文件记录源文件名称
SourceDebugExtension类文件用于存储额外的调试信息
Synthetic类,方法表,字段表标志方法或字段为编译器自动生成的
LocalVariableTypeTable是哟很难过特征签名代替描述符,是为了引入泛型语法之后能描述泛型参数化类型而添加
RuntimeVisibleAnnotations类,方法表,字段表为动态注解提供支持
RuntimeInvisibleAnnotations类,方法表,字段表用于指明哪些注解是运行时不可见的
RuntimeVisibleParameterAnnotation方法表作用与RuntimeVisibleAnnotations属性类似,只不过作用对象或方法
RuntimeInvisibleParameterAnnotation方法表作用与RuntimeInvisibleAnnotations属性类似,只不过作用对象或方法
AnnotationDefault方法表用于记录注解类元素的默认值
BootstrapMethods类文件用于保存invokeddynamic指令引用的引导方法限定符



类型名称数量含义
u2attribute_name_index1属性名索引
u4attribute_length1属性长度
u2max_stack1操作数栈深度的最大值
u2max_locals1局部变量表所需的存续空间
u4code_length1字节码指令的长度
u1codecode_lenth存储字节码指令
u2exception_table_length1异常表长度
exception_infoexception_tableexception_length异常表
u2attributes_count1属性集合计数器
attribute_infoattributesattributes_count属性集合








©著作权归作者所有:来自51CTO博客作者wx60954dfc6372e的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 0506oop作业
  2. php之类与继承
  3. 谈谈使用JS库解决小程序跨页传递消息和数据问题的方法
  4. 5.不确定性推理方法: 可信度方法, 证据理论
  5. 3.分治算法的设计思想与分析方法: 芯片测试, 快速排序, 幂乘算法
  6. PHP基础知识:PHP代码书写规范及数组遍历方法
  7. 我赌你不清楚Spring中关于Null的这些事
  8. 就是要让你彻底学会 @Bean 注解
  9. 来探讨一下最近面试问的ThreadLocal问题

随机推荐

  1. Oracle Pro*c 中sqlca以及oraca的定义和
  2. PostgreSQL的数据存储(十七)---数据存储
  3. Mssql根据表名获取字段
  4. 这被认为是正常形式的失败吗?
  5. 建议一种有效的查询方式
  6. Code First for Mysql 错误:未为提供程序
  7. sql语句,order by后加参数问题
  8. mybatis中 insert into select 批量生成u
  9. ORA-19909:当进行不完全恢复之后使用open
  10. sql 2005判断某个表或某个表中的列是否存