class文件结构入门认识

时间:2021-09-02 12:34:27

Jdk10
javac -g TestClass.class
javap -v TestClass.class获取字节码
hexdump -C TestClass.class获取字节码16进制
public class TestClass{
private int m;
public int inc(){
return m + 1;
}
}
class文件结构入门认识
每个类型对应一个结构体可以到oracle官网上查看(很重要看懂大概在看下面的)
class文件结构入门认识
class文件结构入门认识
ca fe ba be 魔数
00 00 minor version
00 36 major version(54)
00 13 常量池个数(18)
常量池开始
1号常量 0a 10对应类中方法的符号引用 00 04 00 0f 分别是常量池的下标 java/lang/Object.:()V
2号常量 09 9 对应字段的符号引用 00 03 00 10 分别是常量池的下标 TestClass.m:I
3号常量 (0x00000014) 07 7对应常量池类或者接口的符号引用, 00 11(这个是十六进制对应十进制为17号常量,其他的一样)表示常量池下标TestClass
4号常量07 对应常量池类或者接口的符号引用, 00 12表示常量池下标java/lang/Object
5号常量(0x0000001a)01 UTF-8编码的字符串 (0x0000001b)00 01(字符串长度) 6d(字符串内容) m
6号常量01 00 01 49同上5号 I
7号常量01 00 06 3c 69 6e 69 74 3e同上5号
8号常量(0x0000002b)01 00 03 28 29 56 同上5号 ()V
9号常量 01 00 04 43 6f 64 65 同上5号 Code
10号常量01 00 0f 4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65同上5号LineNumberTable
11号常量01 00 03 69 6e 63同上5号inc
12号常量01 00 03 28 29 49同上5号()I
13号常量01 00 0a 53 6f 75 72 63 65 46 69 6c 65 同上5号SourceFile
14号常量(0x00000063)01 00 0e 54 65 73 74 43 6c 61 73 73 2e 6a 61 76 61 同上5号TestClass.java
15号常量(0x00000074)0c查表知道这是字段或方法的部分符号引用 00 07 00 08常量池下标:()V
16号常量0c 00 05 00 06同上15 m:I
17号常量01 00 09 54 65 73 74 43 6c 61 73 73同上5号TestClass
18号常量01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74同上5号java/lang/Object
常量池到此结束
access_flags就像理解标志寄存器一样去理解这16位 但是这16位只有几个状态是有效的
00 21(表示ACC_SUPER,ACC_PUBLIC)
this_class
00 03 对应3号常量
super_class
(0x000000a1)00 04对应4号常量
interfaces_count
00 00
interfaces[interfaces_count],因为上面接口数为零,这里面就不占用存储空间
fields_count
class文件结构入门认识
(0x000000a5)00 01数量为1
fields_info字段表用于描述接口或者类中声明的变量
00 02 00 05 00 06 这就是一个域的表示00 02为修饰符信息 00 05(常量池下标) 为变量名 00 06(常量池下标)为变量类型
(0x000000ad)00 00(attributes_count这个值为零attributes不占用存储空间)
methods_count
00 02方法数
class文件结构入门认识
methods_info
(0x000000b1)00 01 00 07 00 08 00 01 00 09 00 00 00 1d 00 01
方法修饰符00 01(public)为修饰符信息 00 07(常量池下标) 为方法名 00 08(常量池下标)为描述符attributes_count为蓝色00 01 属性索引为00 09即9号常量 属性长度黄色部分以此类推就是方法的Code信息max_stack 00 01 ,max_locals 00 01,code_length 00 00 00 05 code
2a b7 00 01 b1,exception_table_length 00 00,exception_table,attributes_count 00 01,attribute_name_index 00(0x000000d0) 0a剩下的自己对照表看就好了
inc方法也一样
对照
class文件结构入门认识
attributes_count
attributes_info