JavaWeb技术内幕五:深入class文件结构

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/81456422 这位大侠,这是我的公众号:程序员江湖。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/81456422

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)

Java的代码可以一次编译,到处运行,是因为JVM可以识别class文件,JVM虚拟机和物理机的效果是一样的,有一套指令集让代码翻译成对应的操作,只不过JVM指令集最终还要去执行物理机的指令集,比如X86。

JVM指令集简介

oolong编程语言是一种汇编语言,我们可以将class文件先转化为oolong汇编语言,以便理解。实际上JVM直接基于字节码运行,不需要经过中间的汇编过程,但是我们依然可以先把它翻译成汇编,这些汇编代码可以很好地对应JVM提供的指令集。

如果直接用class文件去匹配jvm指令集,肯定是不太现实的。

与类相关的指令

这部分指令主要与类信息相关,譬如原文件名,类名,父类,以及修饰符等等,一般类中的操作都有对应的JVM指令相对应(这里的指令指的是汇编指令)

方法的定义

方法的定义包括修饰符,方法名,操作函数等等,也有其对应的指令。比如invokervirtual调用实例方法。

属性的定义

属性定义包括了数据类型,方法的修饰属性,类的修饰属性,等等。

其他指令集

由于JVM的指令集是基于栈进行操作的,所以也有与栈操作相关的指令集,还有与运算相关,与数组操作相关的指令集等等。

这里也有我们熟悉的同步操作相关指令集,monitor enter和monitor out,这个汇编指令可以帮助jvm完成同步操作。

class文件头的表示形式

class文件的内容是顺序排列的。

第一行是一个标识符,是”cafebabe”,表明这个文件是一个class文件。

后面两个字节表示版本分为。

所以前6个字节是表示class文件的基本头信息,jvm加载class时会检查其是否符合条件。

常量池

接下来到了常量池部分。

第一行有两个字节表示该类中含有常量的总数,有十几种类型

这些常量通常都是相互引用的。

基本数据类型

Integer,Float,Long等等

UTF-8常量类型

一般用于存储字符串值

fieldref、methodref

这两个类型很明显是为了描述class中的属性项和方法的,如何表示一个class中的属性和方法呢,比如fieldref,前两个字节表示是哪个类中的field,后面两个字节表示这个fieldref的name和type。

methodref和fieldref也类似。

所以methodref和fieldref存的是类名称和nameandtype

class常量类型

class常量表示的是该类的名称,会指向另一个UTF-8类型的常量来存储具体名称,因为名称是字符串啦。

所以class常量中存的是索引。

nameandtype

nameandtype是为了表达methodref和fieldref的名称和类型描述才存在的,名称通常用utf8来表示,类型描述也用utf8来表示。

所以nameandtype主要包含两个utf8的位置索引

类信息

常量列表的后面就是类本身的信息描述了。比如这个类的访问控制。名称和类型,以及父类信息等。

fields和methods定义

类信息描述后面就是每个fields和methods的具体定义了,刚才的methodref和fieldref其实就是索引到了这一部分的内容。

类属性描述

和field和method一样,class同样也有附加属性描述。

javap生成的class文件结构

除了通过oolong生成class文件格式,也可以通过javap来生产class文件格式。这个文件格式更容易理解。

相关文章
|
3天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
10 2
|
7天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
16 1
|
11天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
14天前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
23 7
|
12天前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
|
12天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
27 3
|
13天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
23 4
|
12天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
9 2
|
14天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
20 4
|
12天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
15 1