一把小刀,直插 class 文件的小心脏(2)

简介: 一把小刀,直插 class 文件的小心脏

接下来,我们再来看一段代码。


class Hello {

   public final String s = "hello";

}


“hello”是一个字符串,它的十六进制为 68 65 6c 6c 6f,我们来看一下它在 class 文件中的位置。


image.png


前面还有 3 个字节,第一个字节 0x01 是标识,标识类型为 CONSTANT_Uft8_info,第二个和第三个自己 0x00 0x05 用来表示第三部分字节数组的长度。


image.png


与 CONSTANT_Uft8_info 类型对应的,还有一个 CONSTANT_String_info,用来表示字符串对象(之前代码中的 s),标识是 0x08。前者存储了字符串真正的值,后者并不包含字符串的内容,仅仅包含了一个指向常量池中 CONSTANT_Uft8_info 的索引。来看一下它在 class 文件中的位置。


image.png


CONSTANT_String_info 通过索引 19 来找到 CONSTANT_Uft8_info。


image.png


除此之外,还有 CONSTANT_Class_info,用来表示类和接口,结构和 CONSTANT_String_info 类似,第一个字节是标识,值为 0x07,后面两个字节是常量池索引,指向 CONSTANT_Utf8_info——字符串存储的是类或者接口的全路径限定名。


拿 Hello.java 类来说,它的全路径限定名为 com/itwanger/jvm/Hello,对应的十六进制为“636f6d2f697477616e6765722f6a766d2f48656c6c6f”,是一串 CONSTANT_Uft8_info,指向它的 CONSTANT_Class_info 在 class 文件中的什么位置呢?


先不着急,这里给大家介绍一款可视化字节码的工具 jclasslib bytecode viewer,可以直接在 IDEA 的插件市场安装。安装完成后,选中 class 文件,然后在 View 菜单里找到 Show Bytecode With Jclasslib 子菜单,就可以查看 class 文件的关键信息了。


image.png


从上图中可以看到,常量池的总大小为 23,索引为 04 的 CONSTANT_Class_info 指向的是是索引为 21 的 CONSTANT_Uft8_info,值为 com/itwanger/jvm/Hello。21 的十六进制为 0x15,有了这个信息,我们就可以找到 CONSTANT_Class_info 在 class 文件中的位置了。


image.png


0x07 是第一个字节,CONSTANT_Class_info 的标识符,然后是两个字节,标识索引。


还有 CONSTANT_NameAndType_info,用来标识字段或方法,标识符为 12,对应的十六进制是 0x0c。后面还有 4 个字节,前两个是字段或者方法的索引,后两个是字段或方法的描述符,也就是字段或者方法的类型。


来看下面这段代码。


class Hello {

   public void testMethod(int id, String name) {

   }

}


用 jclasslib 可以看到 CONSTANT_NameAndType_info 包含的索引有两个。


image.png


一个是 4,一个是 5,可以通过下图来表示 CONSTANT_NameAndType_info 的构成。


image.png


对应 class 文件中的位置如下图所示。


image.png



相关文章
|
6月前
|
C++
【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
83 1
|
6月前
【每日一题Day313】LC2511最多可以摧毁的敌人城堡数目 | 模拟
【每日一题Day313】LC2511最多可以摧毁的敌人城堡数目 | 模拟
40 0
|
6月前
|
传感器 算法 小程序
基于ESP32的平衡车设计与实现方法(含源码)
基于ESP32的平衡车设计与实现方法(含源码)
315 0
|
机器学习/深度学习 存储 人工智能
用视频插帧开一个流体力学分析的外挂
阿里云提供的线上AI能力在处理视觉信息方面已经有较为成熟和通用的产品,其中视频插帧可以用于现有超高速相机增强,用于粒子测量PIV、BOS背景纹影等领域。本文为视觉流体力学分析预处理中间件的开发思路、技术架构设计和开发实战中参数的设置介绍,对一些数字影像的基础概念和阿里云视觉人工智能的API细节进行了分析。
432 0
用视频插帧开一个流体力学分析的外挂
每次放一个细胞,打印心脏或上千年,斯坦福大学如何加快3D打印心脏?
每次放一个细胞,打印心脏或上千年,斯坦福大学如何加快3D打印心脏?
C++语法基础(七)——可恶的指针(三)
C++语法基础(七)——可恶的指针(三)
C++语法基础(七)——可恶的指针(三)
|
存储 C++ 索引
C++语法基础(七)——可恶的指针(二)
C++语法基础(七)——可恶的指针(二)
C++语法基础(七)——可恶的指针(二)
|
存储 C++
C++语法基础(七)——可恶的指针(一)
C++语法基础(七)——可恶的指针(一)
C++语法基础(七)——可恶的指针(一)
|
算法 安全 C++
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
282 0
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移