没有合适的资源?快使用搜索试试~ 我知道了~
字节码文件结构详解.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 179 浏览量
2022-06-26
21:21:41
上传
评论
收藏 5.09MB DOCX 举报
温馨提示
试读
23页
“一次编写,到处运行(Write Once,Run Anywhere)“,这是 Java 诞生之时一个非常著名的口号。在学习 Java 之初,就了解到了我们所写的.java会被编译期编译成.class文件之后被 JVM 加载运行。JVM 全称为 Java Virtual Machine,一直以为 JVM 执行 Java 程序是一件理所当然的事情,但随着工作过程中接触到了越来越多的基于 JVM 实现的语言如Groovy Kotlin Scala等,就深刻的理解到了 JVM 和 Java 的无关性,JVM 运行的不是 Java 程序,而是符合 JVM 规范的.class字节码文件。字节码是各种不同平台的虚拟机与所有平台都统一使用的程序储存格式。是构成Run Anywhere 的基石。因此了解 Class 字节码文件对于我们开发、逆向都是十分有帮助的。
资源推荐
资源详情
资源评论
字节码文件结构详解
“一次编写,到处运行(Write Once,Run Anywhere “ ) ,这是 Java 诞生之时一
个非常著名的口号。在学习 Java 之初,就了解到了我们所写的.java 会被编译
期编译成.class 文件之后被 JVM 加载运行。JVM 全称为Java Virtual
Machine ,一直以为 JVM 执行 Java 程序是一件理所当然的事情,但随着工作
过程中接触到了越来越多的基于 JVM 实现的语言如 GroovyKotlinScala 等,
就深刻的理解到了 JVM 和 Java 的无关性,JVM 运行的不是 Java 程序,而是
符合 JVM 规范的.class 字节码文件。字节码是各种不同平台的虚拟机与所有
平台都统一使用的程序储存格式。是构成 Run Anywhere 的基石。因此了解
Class 字节码文件对于我们开发、逆向都是十分有帮助的。
Class 类文件的结构
概述
Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照
顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符,这使得整个
Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当
遇到需要占用 8 位字节以上空间的数据项时,则会按照 Big- Endian 的方式分
割成若干个 8 字节进行存储。Big- Endian 具体是指最高位字节在地址最低位、
最低位字节在地址最高位的顺序来存储数据。SPARC、PowerPC 等处理器默认使
用 Big- Endian 字节存储顺序,而 x86 等处理器则是使用了相反的 Little-
Endian 顺序来存储数据。因此为了 Class 文件的保证平台无关性,JVM 必须对
其规范统一。
Class 文件结构
在讲解 Class 类文件结构之前需要先介绍两个概念:无符号数和表。一种类似
C 语言结构体的伪结构。
无符号数:基本类型数据,一 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、
4 个字节和 8 个字节的无符号数。用来描述数字、索引引用、数量值或者按照
UTF-8 编码构成字符串值。
表:由多个无符号数或者其他表作为数据项构成的复合数据类型,所有的表都习惯
以_info 结尾,用于描述有层次关系的复合结构的数据。
当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计
数器加若干个连续的数据项的形式,这时就代表此类型的集合。整个 Class 文
件本质上就是一张表,其数据项如下伪代码所示:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
每项数据项的含义我们可以对照下图参照表:
同时我们将根据一个具体的 Java 类来分析 Class 文件结构
public class ByteCode {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
其.class 文件内容如下:
使用javap命令可以得到反汇编代码:
Classfile /Users/chenjianyuan/IdeaProjects/blog/blog-web/target/test-
classes/tech/techstack/blog/ByteCode.class
Last modified 2020-8-8; size 581 bytes
MD5 checksum 43eb79f48927d9c5bbecfa5507de0f3c
Compiled from "ByteCode.java"
public class tech.techstack.blog.ByteCode
剩余22页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功