class文件结构
- Magic Number
- CA FE BA BE
- Minor Version
- class文件的版本号
- Major Version
- constant_pool_count
- constant_pool 长度为constant_pool_count-1的表
- 1 CONSTANT_Utf8_info
- tag:1 占用一个字节的空间
- length 占用的字节数
- bytes 长度为length的字符串
- 3 CONSTANT_Integer_info
- tag:3
- bytes 4个字节,Big-Endian(高位在前)存储int值
- 4 CONSTANT_Float_info
- tag:4
- bytes 4个字节,Big-Endian存储float值
- 5 CONSTANT_Long_info
- tag:5
- bytes 8个字节,Big-Endian存储long值
- 6 CONSTANT_Double_info
- tag:6
- bytes 8个字节,Big-Endian存储double值
- 7 CONSTANT_Class_info
- tag:7
- index 2字节指向类全限定明项的索引
- 8 CONSTANT_String_info
- tag:8
- index 2字节指向字符串自变量的索引
- 9 CONSTANT_Fieldref_info
- tag:9
- index 2字节指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
- index 2字节指向字段描述符CONSTANT_NameAndType的索引项
- 10 CONSTANT_Methodref_info
- tag:10
- index 2字节指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
- index 2字节指向字段描述符CONSTANT_NameAndType的索引项
- 11 CONSTANT_InterfaceMethodref_info
- tag:11
- index 2字节指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
- index 2字节指向字段描述符CONSTANT_NameAndType的索引项
- 12 CONSTANT_NameAndType_info
- tag:12
- index 2字节指向该字段或方法名称常量项的索引
- index 2字节指向该字段或方法描述符常量项的索引
- 15 CONSTANT_MethodHandle_info
- tag:15
- reference_kind 1字节 1-9之间的一个值,决定了方法句柄的类型。方法句柄类型的值标示方法句柄的字节码行为。
- reference_index 2字节 对常量池的有效引用
- 16 CONSTANT_MethodType_info
- tag:16
- descriptor_index 2字节 指向Utf8_info结构表示的方法描述符
- 18 CONSTANT_InvokeDynamic_info
- tag:18
- bootstrap_method_attr_index 2字节 当前Class文件中引导方法表bootstrap_methods[]数组的有效索引
- name_and_type_index 2字节 指向NameAndType_info表示的方法名和方法描述符
- 1 CONSTANT_Utf8_info
- access_flags (位运算)
- ACC_PUBLIC 0x0001 是否为public类型
- ACC_FINAL 0x0010 是否为final类型
- ACC_SUPER 0x0020 该标志必须为真,JDK1.0.2之后编译出来的内容必须为真,指明invokespectial指令使用新语义
- ACC_INTERFACE 0x0200 是否为接口
- ACC_ABSTRACT 0x0400 是否为接口或抽象类
- ACC_SYNTHETIC 0x1000 编译器自动生成,非用户代码产生
- ACC_ANNOTATION 0x2000 是否为注解
- ACC_ENUM 0x4000
- this_class
- super_class
- interfaces_count
- interfaces
- fields_count
- fields
- access_flags 2字节
- ACC_PUBLIC 0x0001
- ACC_PRIVATE 0x0002
- ACC_PROTECTED 0x0004
- ACC_STATIC 0x0008
- ACC_FINAL 0x0010
- ACC_VOLATILE 0x0040
- ACC_TRANSIENT 0x0080
- ACC_SYNTHETIC 0x1000
- ACC_ENUM 0x4000
- name_index u2
- descriptor_index u2
- B - byte
- C - char
- D - double
- F - float
- I - int
- J - long
- S - short
- Z - boolean
- V - void
- L - Object
- 数组[ -
- 一维数组[B[Ljava/lang/String
- 多维数组[[C[[[Ljava/lang/String
- attributes_count
- attributes
- access_flags 2字节
- methods_count
- methods
- access_flags 2字节
- ACC_PUBLIC 0x0001
- ACC_PRIVATE 0x0002
- ACC_PROTECTED 0x0004
- ACC_STATIC 0x0008
- ACC_FINAL 0x0010
- ACC_SYNTHETIC 0x020
- ACC_BRIDGE 0x0040 编译器产生的桥接方法
- ACC_VARARGS 0x0080
- ACC_NATIVE 0x0100
- ACC_ABSTRACT 0x0400
- ACC_STRICTFP 0x0800
- ACC_SYNTHETIC 0x1000
- name_index u2
- descriptor_index u2
- 先参数列表(放在小括号内部)后返回值
- void m() -> ()V
- String toString() -> ()Ljava/lang/String;
- long pos(int[] arr1, int arr2, long length) -> ([IIJ)J
- attributes_count
- attributes
- access_flags 2字节
- attributes_count
- attributes
- 既有预定义属性,也可以自定义,java虚拟机自动忽略不认识的属性
- Code - 方法表 - 该方法编译成的字节码指令
- u2 attribute_name_index
- u4 attribute_length
- u2 max_stack
- u2 max_locals
- u4 code_length
- code
- u2 exception_table_length
- exception_table
- u2 attribute_count
- attributes
- ConstantValue - 字段表 - final关键字定义的常量值
- Deprecated - 类、方法表、字段表
- Exceptions - 方法表
- EnchosingMethod - 类文件 - 局部类或匿名类的外部封装方法
- InnerClass - 类文件 - 内部类列表
- LineNumberTable - Code属性 - java源码的行号与字节码指令的对应关系
- LocalVariableTable - Code属性 - 方法局部变量表
- SourceFile - 类文件 - 源文件名称
IDEA可以安装插件查看class文件结构
jclasslib
https://plugins.jetbrains.com/plugin/index?xmlId=jclasslib
可以选中编译完成的class文件,在idea菜单view下有个show bytecode with jclasslib
jclasslib.png class文件结构
网友评论