java 字节码分析_手把手带你分析Java中的Class字节码文件
分析Class文件的源码如下:
package org.yuequan.klass;
public private int m;
public int inc(){
return m + 1;
}
}
笔者使用JDK1.8将源文件编译成class文件,为了更好的手动分析这个class文件,笔者将使用现有的Class分析工具去打开这个class文件。
打开后的Class文件:
Java虚拟机规范对Class文件结构做了严格的规定,其中的字节严格的按顺序紧密的排在一起,中间没有任何的分隔符和其它数据
分析之前先把Java虚拟机规范对Class文件结构的定义先列出来
根据Java虚拟机规范所描述的Class文件结构,我们大致的可以理解类型分别为u1、u2、u4、cp_info、field_info、method_info、attribute_info,其中u1、u2、u4分别为1、2、4无符号整型字节,_info后缀结尾的都是表结构类型
基本的介绍的差不多了,那就正式开始分析吧。
根据ClassFile文件结构来分析,前面4个字节是魔数,魔数为固定的0xCAFEBABE,魔数可以作为一个文件的特殊识别,很多类型的文件,都会在文件前面加几个字节填充魔数,利用魔数来识别文件类型,根据Java虚拟机规范也只有0xFAFEBABE魔数的文件才能被Java虚拟机所接受。
再紧跟着的是2个字节的次版本号
次版本号为0,次版本号从JDK1.2以后次版本号就没有再被使用而是一直使用着主版本号。
再紧跟着2个字节的主版本号
我的主版本号为0x34为52,正好是JDK1.8的版本号,为了方便观看,笔者将JDK的版本号整理了一个列表供参考
再接下来是2个字节的常量池数量
我的常量池数量是19个0x13 = 19,常量池元素索引是从1开始而不是0这点要注意,所以常量池可用数量为1 – count-1,第0项是为了某些指向常量池的索引值的数据在特殊情况下不需要引用任何一个常量池项目的时候就可以将索引置为0
接下来介绍ClassFile的cp_info也就是常量池,常量池中主要存储字面量和符号引用,字面量的意义比较接近于常量的概念,如字符串、final后的常量值等,这里的符号引用主要还是包括:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符,接下来再看下cp_info的结构定义,常量池中每一项都是一个表,到目前JDK8版本共有14个常量类型的结构,为了区分这些常量类型,常量数据的第一字节是tag分别对应着这14个常量类型
概念介绍到这里差不多了,那么开始正式的分析
第一个常量的tag是0x0A对应着10也就是Constant_Methodref_info
根据结构后面还有2个u2类型的class_index和name_and_type_index
class_index 是指常量池中索引为class_index的常量项,name_and_type_index同理,由于后面的常量项还没分析,无法得知index所指的具体值,所以先把值分析出来放在这里吧,不用担心,我在文章的该列出来的地方还会在列一遍,常量池第一项的数据
// index 1
tag = 10
class_index = 4
name_and_type_index = 15
接着我们来分析第二项
第二项tag为9对应着CONSTANT_Fieldref_info
// index 2
tag = 9
class_index = 3
name_and_type_index = 16
第三项
第三项tag为7对应着CONSTANT_Class_info
// index 3
tag = 7
name_index = 17
第四项
第四项tag为7对应着CONSTANT_Class_info
// index 4
tag = 7
name_index = 18
第五项
第五项的tag为1对应着CONSTANT_Utf8
长度为1
长度为1那bytes也就只有一个
// index 5
tag = 1
length = 1
bytes = ['m'] // bytes = [6D] 6D = 109 => UTF8 => m
第六项
嗯哼tag还是01
长度为1
// index 6
tag = 1
length = 1
bytes = ['I'] // bytes = ['49'] 49 => 73 => UTF8 => I
第七项
tag还是01
长度为6
// index 6
tag = 1
length = 6
// 23333 很长于是注释写这里
// [0x3C, 0x69, 0x6E, 0x69, 0x74, 0x3E]
// to UTF8
// ['']
// bytes.toString() => ""
bytes = ['']
第八项
tag仍为01 ,
java 字节码分析_手把手带你分析Java中的Class字节码文件相关推荐
- java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理
前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...
- java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理
前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...
- java对对碰游戏设计报告_手把手带你用Java打造一款对对碰游戏(下篇)
上篇文章介绍了对对碰游戏的理论部分和介绍了JLabel.JButton.JPanel.ImageIcon.JTextField.JProgressBar等组件的基本使用,介绍了进度条(JProgres ...
- 我的世界java无法安装包_手把手教你搭建java环境
前文 由于一些历史原因,开发java程序需要技术人员自行搭建环境,而搭建环境对于新手来说并不友好,不像其他语言那般方便,现如今,为帮助想入门java却无法顺利搭建的同学,编写该教程,如果觉得本文有用, ...
- 【手把手带你学Java EE】多线程那些事,你了解了吗?
[手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...
- java完整的利用itext5制作pdf、二维码图片插入pdf,并解析pdf中的二维码信息
利用itext5.zxing.QRCore制作pdf.二维码图片插入pdf,并解析pdf中的二维码信息,手机可以实现扫描获取二维码的信息,并进行验证你的解析是否正确. 先是生成二维码图片并插入pdf中 ...
- Android:手把手带你深入剖析 Retrofit 2.0 源码
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...
- 多线程导出excel高并发_大牛带你深入java多线程与高并发:JMH与Disruptor,确定能学会?...
前言 今天我们讲两个内容,第一个是JMH,第二个是Disruptor.这两个内容是给大家做更进一步的这种多线程和高并发的一些专业上的处理.生产环境之中我们很可能不自己定义消息队列,而是使用 Disru ...
- 威联通nas怎么更换大硬盘_手把手带你玩转NAS 篇一:无损转移硬盘数据(威联通篇)TS-453Bmini...
手把手带你玩转NAS 篇一:无损转移硬盘数据(威联通篇)TS-453Bmini 2019-12-15 11:00:00 51点赞 694收藏 72评论 你是AMD Yes党?还是intel和NVIDI ...
最新文章
- university, school, college, department, institute的区别
- 菜鸟学iPhone开发-计算器实例(实现篇)
- pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区
- 《 线性代数及其应用 (原书第4版)》—— 2.3 可逆矩阵的特征
- LeetCode - 15. 3Sum
- php 数据分别是怎么传的_四种php页面间传递数据方法
- .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
- linux 基础学,linux基础学习【1】
- js aes加密_nodejs中使用Crypto-JS对图片进行加解密
- 科目三路考流程及注意事项
- access 文本转换数字_LabVIEW访问Access数据库教程
- 画时序图软件 TimeGen 3.2 TimingDesigner 9.103 AndyTiming
- Guice 的工作原理
- 大话MIMO-OFDM联合工作实现过程
- 启发式搜索解决八数码问题
- 不能被编辑的html文档,word不能编辑怎么办 Word文档怎么设置成不可编辑?
- rust怎么建柱子_原神慈盐之末任务怎么做?原神钟离传说任务的方碑柱子点亮顺序...
- bch纠错码 码长8_密码学BCH纠错编码算法
- 智慧城市产业热点板块及产业图谱
- 修改MAC地址 (苹果电脑)
热门文章
- 0xbc指令 st75256_CIRCUIT-BREAKER GEB3160FFM
- kafka原理_kafka入门(原理搭建简单使用)
- 易语言html规则分析,易语言算法原理浅析【一】(示例代码)
- mysql查询大于0的标记_MySQL如何查询回答数大于0的问题并分页
- python找出主力合约价格_如何找出全部期货主力合约和次主力合约?
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
- 网络安全06_安装Windows XP_几个虚拟机能够相互ping通,并且能够ping通互联网114.114.114.114
- 应用事件探查器优化SQL Server系统[转]
- 【20190226】JavaScript-知识点记录:dom0级事件,dom2级事件
- centos安装Oracle virtual box