在 JVM 眼中 .class 文件是什么样的?值得收藏( 二 )


类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
与C和C++不同 , Java代码编译后没有“连接”的步骤 , 在JVM加载Class文件的时候进行动态连接 。.Class文件不会保存各方法、字段的最终内存布局信息 , 因为不能经过运行期转换无法得到真正的内存入库地址 , 无法被JVM使用 。在JVM运行时 , 从常量池中拿到对应的符号引用 , 解析、翻译到具体的内存地址中再进行使用 , 这些信息也就存于JVM的方法区中 。

在 JVM 眼中 .class 文件是什么样的?值得收藏

文章插图
 
常量池所占用长度不定 , 需要 0x0008 ~ 0x0009 提供常量数量统计 , 再根据常量池里的具体常量类型推算出具体总占用的长度 。
但这比较繁琐 , 每一种常量类型对应一份表 , 需要根据表的不同查阅具体的表结构来获取信息 。常量类型的第一位 u1 表明来对应常量的表结构 , 对应信息如下
在 JVM 眼中 .class 文件是什么样的?值得收藏

文章插图
 
除必要外 , 本文不打算列出各个对应的表结构 , 具体结构可参考
Class类文件结构之常量表
https://blog.csdn.net/u014296316/article/details/83020087
这里抛砖引玉 。
在 JVM 眼中 .class 文件是什么样的?值得收藏

文章插图
 
常量池第一个常量
第一个常量类型由 0x000A 处标出 , 值为0A , 十进制为10 , 查表 , 类型为CONSTANT_Methodref_info(不得不说现在的编辑器很强大 , 没有对应功能的话就只能慢慢查了) 。
表中数据类型为u1、u2、u2 共占 5 个字节(具体表信息和内容含义后文再续) 。如果是CONSTANT_Utf8_info类型 , 还会有 length 属性表明字面量占用字节长度 , 需要加上此长度 。则第二个常量类型由 0x000F 处标出 , 值为0F , 十进制为09 , 表类型为CONSTANT_Fieldref_info 。以此类推...
这样一步一步查找对应常量也是比较麻烦的 , 好在Java内置类工具——javap可对.Class文件字节码进行分析 , 通过命令
javap -verbose fileName
能得到下图信息 :(仅展示了常量池部分)
在 JVM 眼中 .class 文件是什么样的?值得收藏

文章插图
 
javap分析常量池
常量池数量值在 0x0008 ~ 0x0009 为 23 , 转换十进制为35 , 表示常量池索引范围为 1~35 。观察上两张图 , 前者索引从0开始 , 后者索引从1开始 。
若摸不着门路 , 常量池的分析着实让人头大 , 个人看来 , 常量池里的信息是在 “搭积木”。
本例子中 , 常量池涉及到的常量类型为:
CONSTANT_Methodref_info
CONSTANT_Fieldref_info
CONSTANT_String_info
CONSTANT_Class_info
CONSTANT_Interger
CONSTANT_NameAndType
CONSTANT_Utf8
暂时抛开具体表结构 , 以上表类型结构关系如示:
在 JVM 眼中 .class 文件是什么样的?值得收藏

文章插图
 
常量池常量类型结构
上面仅画出了当前例子涉及到的常量类型的组成关系 , 任意类型的常量 , 不断拆分 , 最后都会指向基本类型的常量CONSTANT_Utf8 , 或自身就为基本类型如CONSTANT_Interger 。
可以理解为 , 基本常量类型CONSTANT_Utf8本身没有过多意义 , 其它的类型为场景 , 为CONSTANT_Utf8赋予了意义 。
CONSTANT_Utf8_info可以算是最基本的类型 , 结构为
// 伪代码
{
// 常量类型
u1 tag;
// 字节长度
u2 length;
// UTF-8缩略编码
bytes[length];
}
在遇到CONSTANT_Utf8_info类型的常量时 , 将bytes逐个按照UTF-8缩略编码即可得到对应的字面量
04 类级信息
定义的类为
public class TestClass implements Serializable
其中包含的信息为:
类本身:TestClass
访问标志:public
实现接口Serializable
父类为:Object
从.Class文件格式表中 , 在常量池后紧接着的数据 , 就是类级数据
在 JVM 眼中 .class 文件是什么样的?值得收藏

文章插图
 
从 0x0143 ~ 0x014C :
access_flags(u2): 十六进制值为 0x0021


推荐阅读