重点:
大体结构
无符号数或表 | 中文翻译 | 英文 | 数量 |
---|---|---|---|
u4 | 魔术 | magic | 1 |
u2 | 次版本号 | minor_version | 1 |
u2 | 主版本号 | major_version | 1 |
u2 | 常量计数器 | constant_poo_count | 1 |
cp_info(这是一个表) | 常量池 | constant_pool | constant_pool_count-1 |
u2 | 访问标记 | access_flags | 1 |
u2 | 类索引 | this_class | 1 |
u2 | 父类索引 | super_class | 1 |
u2 | 接口计数器 | interfaces_class | 1 |
u2 | 接口索引集合 | interfaces | interfaces_count |
u2 | 字段计数器 | fields_count | 1 |
fields_info | 字段集合表 | field | fields_count |
u2 | 方法计数器 | methods_count | 1 |
method_info | 方法表集合 | methods | methods_count |
u2 | 属性计数器 | attributes_count | 1 |
attribute_info | 属性表集合 | attribute | attributs_count |
需要记住的重点:
魔术:kafebabe 固定
常量池:字面量和符号引用,常量池中增加一个方法会正价4个常量,
方法符号的引用,方法的部分符号引用,方法的名称, 方法的描述
字段集合表包含的信息:
字段的作用域(public,private,protected修饰符)
实例变量还是类变量(static修饰符)
可变性(final)
并发可见性(volatile)
可否被序列化
字段数据类型(基本类型,对象,数组)
字段名称
class文件包含的内容,数据结构
class文件包含:虚拟机指令,符号表,其他辅助信息
数据结构:无符号数,表
重点:class文件采用类似c语言结构体的伪结构体来存储数据
如何查找
首先将java文件编译成class文件
然后使用javap 命令查看class文件
主机后按图索冀
扩展
什么是字面量?
字面量:int m = 3; (字面量就是=号右边的东西)
init和clinit (这两个字段,使用javap命令可以看到)
init:实例化初始化方法
clinit:类和接口的初始化
所有的类变量初始化语句和静态语句都被java编译收集到一起,放到clinit;
init:
调用new初始化对象的时候
调用反射的时候newInstance()
调用clone方法的时候
ObjectInpustream.greObject序列化的时候