【参考链接】
深入理解Java Class文件格式(三)http://blog.csdn.net/zhangjg_blog/article/details/21557357
深入理解Java Class文件格式(四)http://blog.csdn.net/zhangjg_blog/article/details/21658415
深入理解Java Class文件格式(五)http://blog.csdn.net/zhangjg_blog/article/details/21781021
通过gclasslib来粗略讲解一下.class文件的整体结构
整体结构如下所示
以如下源代码为例
Java Code
1 | package com.test.a; |
magic
前4个字节称为magic(魔数),统一为0xCAFEBABE(谐音cafe baby)。
version
接下来4个字节为minor version和majorversion。如图表示是使用JDK1.8编译生成的。
constant pool
常量池前面已经详细讲过,这里不在叙述
access_flags
标志名 | 标志值 | 标志含义 | 适用对象 |
ACC_PUBLIC | 0x0001 0000 0000 0000 0001 | public类型 | 类、接口、枚举、注解 |
ACC_FINAL | 0x0010 0000 0000 0001 0000 | final类型 | 类 |
ACC_SUPER | 0x0020 0000 0000 0010 0000 | 使用新的invokespecial语义 | 类、接口 |
ACC_INTERFACE | 0x0200 0000 0010 0000 0000 | 接口类型 | 接口 |
ACC_ABSTRACT | 0x0400 | abstract类型 | 类、接口 |
ACC_SYNTHETIC | 0x1000 | 该类不由用户代码生成 | 类、接口、枚举、注解 |
ACC_ANNOTATION | 0x2000 | 注解类型 | 注解 |
ACC_ENUM | 0x4000 | 枚举类型 | 枚举 |
this
super
interfaces
fields
m1
m2
methods
<init>
method1
attributes
通用
Deprecated
以Class上的Deprecated属性为例
Synthetic
Class
SourceFile
InnerClasses
Field
ConstantValue
如前文所述,static final类型常量会有ConstantValue属性,用于在准备阶段设置值
Method
以method1()方法为例
Exceptions
这个Exceptions属性是在方法上throw的,下面的是在方法中try/catch/throw的
Code
Minor version应该是Maxinum stack depth,表示操作数栈的最大深度是3
Maximum local variables表示局部变量表占用的总空间大小是5 个槽位
字节码指令如下
方法中的异常表如下
Code属性还还含有子属性,用于进一步存储一些额外信息
LineNumberTable
用于记录字节码指令的偏移量和行号之间的对应关系
LocalVariableTable
局部变量表,共有4个形式参数+局部变量
index表示局部变量占用的槽位的位置
其中double类型arg1占用的是1~2槽位,其余各占1个槽位。共5个槽位,跟Code中的Maximum local variables一致