目录
一、概述
只是对class做一次完整的分析,不涉及理论介绍。
1.源文件
package com.gyw.practice;
public class TestClass{
private int m;
public int inc(){
return m + 1;
}
}
2.字节流文件
3.class文件分析
u4 magic;魔数,4个字节:0xCAFEBABE
u2 minor_version;次版本号,2个字节:0x0000(0)
u2 major_version;主版本号,2个字节:0x0034(52)
u2 constant_pool_count;常量池大小,2个字节:0x0013(19) (索引从1开始,左闭右开,18个常量)
cp_info constant_pool[constant_pool_count-1]; cp_info 表,常量池
// 常量池每一项的数据结构 cp_info { u1 tag; // 标识位 u1 info[]; // 表 }
#1:tag,1个字节,0x0A(10),CONSTANT_Methodref,类方法符号引用;class_index,2个字节,0x0004(4),指向#4;name_and_type_index,2个字节,0x000F(15),指向#15;
info { u1 tag; // 标识位 u2 class_index; // 类描述索引 u2 name_and_type_index; // 名称和类型描述索引 }
#2:tag,1个字节,0x09(9),CONSTANT_Fieldref,字段符号引用;class_index,2个字节,0x0003(3),指向#3;name_and_type_index,2个字节,0x0010(16),指向#16;
info { u1 tag; // 标识位 u2 class_index; // 类描述索引 u2 name_and_type_index; // 名称和类型描述索引 }
#3:tag,1个字节,0x07(7),CONSTANT_Class,类或接口的符号引用;name_index,2个字节,0x0011(17),指向#17;
CONSTANT_Class_info { u1 tag; u2 name_index; }
#4:tag,1个字节,0x07(7),CONSTANT_Class,类或接口的符号引用;name_index,2个字节,0x0012(18),指向#18;
#5:tag,1个字节,0x01(1),CONSTANT_Utf8,utf8字符串常量;length,2个字节,0x0001(1),数组大小为1;bytes数组,1个字节,0x6D(109), ASCII字符m;
总结为:m
CONSTANT_Utf8_info { u1 tag; // 标志位 u2 length; // bytes数组的长度(多少个8位字