字节码整体结构
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html 官网帮助文档
Java字节码整体结构图
对于图的解释说明
类型 | 名称 | 数量 |
---|---|---|
u4(表示占据4个字节) | magic(魔数) | 1 |
u2 | minor_version(次版本号) | 1 |
u2 | major_version(主版本号) | 1 |
u2 | constant_pool_count(常量个数) | 1 |
cp_info | constant_pool(常量池表) | constant_pool_count-1 |
u2 | access_flags(类的访问控制权限) | 1 |
u2 | this_class(类名) | 1 |
u2 | super_class(父类名) | 1 |
u2 | interfaces_count(接口个数) | 1 |
u2 | interfaces(接口名) | interfaces_count |
u2 | fields_count(域个数) | 1 |
field_info | fields(域的表) | fields_count |
u2 | methods_count(方法的个数) | 1 |
method_info | methods(方发表) | methods_count |
u2 | attributes_count(附加属性的个数) | 1 |
attribute_info | attributes(附加属性的表) | attributes_count |
class字节码数据类型
Class字节码有两种数据类型
-
字节数据直接量
这是基本的数据类型。供细分为u1、u2、u4、u8四种,分别代表连续的1个字节、2个字节、4个字节、8个字节组成的整体数据
-
表(数组)
表是由多个基本数据或其他表,按照既定顺序组成的大的数据集合。表是由结构的,它的结构体现在:组成表的成分所在的位置和顺序都是已经严格定义好的
用一个数据结构表示
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
工具
使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类的构造方法、类中的方法信息、类变量与成员变量等信息。
javap参数
-v -verbose,输出附加信息(包括行号、本地变量表,反汇编等详细信息)
-c,对代码进行反汇编
-p 输出私有的相关信息
jclasslib,字节码查看工具,有idea插件
Mac下用Hex Fiend打开,看字节码的组成