当前位置: 首页 > news >正文

直接编辑class文件_JVM循序渐进(一) 浅识class文件

2fe04b05ba4eeac0a19f4719f2b76572.png

jvm系列文章基本结构(红色区域为本文重点介绍内容)

本文希望可以从.java文件的编译,class文件的加载,最终在虚拟机中的运行整个过程进行描述。 作为学习虚拟机过程中的一个总结和输出,本来想法是用视频的方式,但是暂时还没办法实现....,可能以后会有吧。

简单介绍class文件内容,重点了解常量池是如何布局的

首先java文件编译成为class字节码文件之后,在sublime等文本编辑器中打开是一堆16进制的编码,如图所示:

e1ef1aa7f771e58e979f8107ca22c8c2.png

字节码文件16进制 - 图1

而字节码文件的各部分表示含义如图所示:

39a28d830cd5d1948217c5afd4ba5c4d.png

class字节码文件结构 - 图2

1.魔数

每一个class文件的头4个字节称为魔数,它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件。

2.版本

第五六个字节是次版本(Minor Version)。第7和第8个字节是主版本(Major Version)。

3.常量池 (class字节码文件中的重点,也是相对最复杂的一部分)

constant_pool_count:占2字节。0x0016。转化为十进制为22,即说明常量池中有21个常量(仅仅有常量池的计数是从1開始的,其他集合类型均从0開始),索引值为1~22。第0项常量具有特殊意义。假设某些指向常量池索引值的数据在特定情况下须要表达“不引用不论什么一个常量池项目”的含义,这样的情况能够将索引值置为0来表示。

常量池中主要存放两大类常量:字面量和符号引用。字面量如文本字符串、声明为final的常量值等。符号引用包含三类常量:类和接口的全限定名、字段的名称和描写叙述符、方法的名称和描写叙述符。

constant_pool_count之后则是常量池的具体内容:

我对图1中的16进制字节码文件的前几个字节进行了解析:在前面一些标识符号之后(即从第11个字节开始)以 0a00 0a00 1e为例

0a转化为10进制是10,代表的是常量池表中的flag=10的那一项,常量池表如图所示(选取了一部分截图):

144aaa839950f635aa0f33bfc83ae8b5.png

常量池表 -图3

0a 代表的就是CONSTANT_Methodref_info

CONSTANT_Methodref_info中的两项内容为该项标识所属的类、和该项标识方法的信息(参数返回值类型等),分别为CONSTANT_NameAndType_info和CONSTANT_Class_info,而这两项其中又包含了其他的常量池引用。

大体结构:

CONSTANT_Methodref_info---

----CONSTANT_Class_info

----CONSTANT_Utf8_info

----CONSTANT_NameAndType_info

----CONSTANT_Utf8_info

----CONSTANT_Utf8_info

分析图如下:

c67b9802b192aae9173dd3e476714d67.png

对字节码文件的简单分析 - 图4

CONSTANT_Methodref_info---

----CONSTANT_Class_info

----CONSTANT_Utf8_info:java/lang/Object

----CONSTANT_NameAndType_info

----CONSTANT_Utf8_info:<>

----CONSTANT_Utf8_info

可以看到常量池中的成员其实是在互相引用(在idea中下载一个jclasslib插件,可以可视化的看到字节码的结构):

c0da073210216b5d0db16cb716f671d2.png

jclasslib中看到的字节码文件中常量池互相引用 - 图5

4.訪问标志

5630f5cc8ea73c0244527ad7089be552.png

访问标识表

5.类索引、父类索引和接口索引集合

this_class:类索引,用于确定这个类的全限定名,占2字节

super_class:父类索引。用于确定这个类父类的全限定名(Java语言不同意多重继承,故父类索引仅仅有一个。

除了java.lang.Object类之外全部类都有父类,故除了java.lang.Object类之外,全部类该字段值都不为0),占2字节

interfaces_count:接口索引计数器。占2字节。

假设该类没有实现不论什么接口。则该计数器值为0,而且后面的接口的索引集合将不占用不论什么字节。

interfaces:接口索引集合,一组u2类型数据的集合。用来描写叙述这个类实现了哪些接口。这些被实现的接口将按implements语句(假设该类本身为接口,则为extends语句)后的接口顺序从左至右排列在接口的索引集合中

6.字段表集合

fields_count:字段表计数器。

fields:字段表集合,

7.方法表集合

8.属性表集合

相关文章:

  • 用python和opencv来测量目标到相机的距离_毕业课题项目——基于单目摄像头的距离测量...
  • c语言判断素数_C语言的那些经典程序 第十一期
  • delphi usb通讯 com通讯_你知道电脑上怎么设置“串口号COM”吗?教你一个方法,1分钟学会...
  • c++ format长度限制_2020年C证(安全员)考试总结及C证(安全员)模拟试题
  • post多个参数_2020Python编程高频面试题:Post和get区别?
  • docker rabbitmq_SpringBoot2.x系列教程64--消息队列之RabbitMQ安装及环境变量配置
  • before start of result set_ECMAScript 6 入门教程—Iterator 和 for...of 循环
  • 前端打印样式乱了_好程序员HTML5大前端分享web前端面试题集锦三
  • python第八周小测验_Python小测试_9
  • 初学者选黑卡还是微单_回答自测你是摄影初学者,还是进阶?
  • python创建随机数组_python随机数组如何生成?
  • java stringbuffer 空格_Java面试真题 |String 的特点是什么?它有哪些重要的方法?...
  • 想要导航提示进入页_一个值得全体信息流优化师和SEMer珍藏的落地页
  • python实现kmean算法_python实现K-means算法
  • python入门干货_Python干货整理,从入门说起(7.4)
  • JavaScript学习总结——原型
  • pdf文件如何在线转换为jpg图片
  • python3 使用 asyncio 代替线程
  • Python连接Oracle
  • Selenium实战教程系列(二)---元素定位
  • 使用 Docker 部署 Spring Boot项目
  • 使用common-codec进行md5加密
  • 手机app有了短信验证码还有没必要有图片验证码?
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • HanLP分词命名实体提取详解
  • !$boo在php中什么意思,php前戏
  • #include到底该写在哪
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计大学生兼职系统
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .form文件_一篇文章学会文件上传
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net中应用SQL缓存(实例使用)
  • @RestController注解的使用
  • @selector(..)警告提示
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Android]Tool-Systrace
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [BROADCASTING]tensor的扩散机制
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [CF543A]/[CF544C]Writing Code
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [C语言]编译和链接
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等
  • [kubernetes]控制平面ETCD
  • [LeetCode] Ransom Note 赎金条
  • [linux] 创建用户
  • [MAC OS] 常用工具