Class文件结构

news/2024/12/1 9:08:50/

Class文件结构

1.Java代码可以跨平台运行的基础就是因为jvm的跨语言特性,无论哪种语言编写的程序,只要能编译成class文件,就能通过Jvm在各种平台上运行。实现这一特性的关键就是同意而强大的Class文件结构,它是异构语言与jvm之间的重要桥梁。(一次编译到处运行)

在这里插入图片描述

前端编译:将符合Java语法规范的Java代码转换位符合jvm规范的字节码文件。

Javac是一种能够将Java源码译为字节码的前端编译器

Javac编译器在将Java源码译为一个有效字节码文件的过程中经历了四个步骤,分别是词法解析,语法解析,语义解析以及生成字节码文件

字节码指令是由一个字节长度的、代表着某种特定含义的操作码以及跟随其后的零个至多个代表此操作所需参数的操作数所构成。虚拟机中许多指令并不包含操作数,只有一个操作码
在这里插入图片描述
Class 文件的结构严格按照上述结构体定义:

  1. 文件以一个 4 字节的魔数开头,紧跟着两个 2 字节的大小版本号
  2. 版本号之后是常量池,常量池的个数为 constant_pool_count,常量池的表项有 constant_pool_count - 1 个
  3. 常量池之后是类的访问修饰符、代表自身类引用、父类引用以及接口数量和实现的接口引用
  4. 接口之后有字段数量和描述,方法数量以及方法描述
  5. 最后存放着类文件的属性信息

目前,高版本的 JVM 可以执行由低版本编译器生成的 Class 文件,但是低版本的 JVM 不能执行由高版本编译器生成的 Class 文件,所以在实际的开发中,我们需要特别注意编译时使用的 JDK 版本与生产环境的 JDK 版本是否一致,如果不一致的话,会报出 UnsupportedClassVersionError
常量池**

常量池是class文件中内容最丰富的区域之一,随着Java虚拟机的不断发展,常量池的内容也不断丰富。同时,常量池对于Class文件中的字段和方法解析也有着至关重要的作用,可以说,常量池是整个class文件的基石。在版本号之后,紧跟着就是常量池的数量,以及若干个常量池表项。

TestClass 编译出来的 Class 文件中,constant_pool_count 为 0x10,也就是说这个 Class 文件中包含了 16 - 1 = 15 个常量项(常量池 0 为保留项,不存放实际内容)

在数量之后,就是常量池中各项的实际内容,不同类型的常量项的内容内容结构各不相同,但是一般都是以 “类型 - 长度 - 内容” 或者 “类型 - 内容” 的格式依次排列。在介绍我们的 TestClass 之前,我们先了解一下常量池项的类型都有哪些。


http://www.ppmy.cn/news/22449.html

相关文章

Tomcat 基础

目录 一:web 概念 1.软件架构 2.资源分类 3.网络通信三要素 二:常见的web服务器 1 .概念 2.常见web服务器软件 三:Tomcat 历史 四:Tomcat 安装 1.下载 2. 安装 四:Tomcat 目录结构 五:Tomcat …

Vue使用v-viewer插件实现图片预览和缩放和旋转等功能

前言 昨天不是做了一个动态的图片展示吗,今天就寻思着能不能完善下功能,可以通过点击图片的方式进行放大缩小,甚至旋转。 图片展示可以参考:Vue显示图片的几种方式 然后我一顿收搜,发现了vue中有这么一款插件&…

46 理论计算机科学基础-北京大学

P10 课程介绍05:46P21-1 预备知识07:43P31-2 确定型有穷自动机例子11:23P41-3 确定型有穷自动机的形式化定义17:51P51-4 设计确定型有穷自动机05:57P61-5 正则运算与封闭性28:16P71-6 非确定型有穷自动机37:43P81-7 DFA与NFA的等价性17:41P91-8 正则语言的封闭性10:30P102-1 正…

Vue3 + vite + Ts + pinia + 实战 + 源码 +electron(2)

十二、异步组件&代码分包&suspense 顶层axios&#xff1a;在setup中&#xff0c;可以不需要使用async&#xff0c;它会自动编译成这个 <script setup lang"ts"> import axios from axiosconst {data:{data}} await axios({url:"http://localho…

Linux嵌入式开发——C编程

文章目录Linux嵌入式开发——C编程一、编写C程序1.1、设置vim编辑器1.2、编写C程序二、编译C程序三、make工具和Makefile文件3.1、编写C程序C文件H文件3.2、不使用make工具3.3、使用make工具和Makefile文件编译Linux嵌入式开发——C编程 一、编写C程序 我们目前就是使用VIM编…

Webug4.0靶场通关

14.Webug4.0靶场通关 显错注入 首先整体浏览网站 注入点&#xff1a; control/sqlinject/manifest_error.php?id1 判断注入类型 输入: and 11 正常, 再输入: and 12 还正常, 排除数字型 输入单引号: ’ 网页发生变化 输入’ – q注释掉单引号,页面回显正常 则为字符型 判…

Linux学习之VMware虚拟机安装

前言 今天是癸卯年正月十五元宵节&#xff0c;在此祝大家元宵快乐&#xff01; 这篇文章主要给大家介绍安装VMware虚拟机的步骤&#xff0c;话不多说&#xff0c;开始安装&#xff01; 安装准备 VWware-workstation rhel-8.2-x86_64-dvd.iso 64 位操作系统 VMware安装 可…

EAPOL四次握手流程

EAPOL四次握手流程协议功能数据帧格式四次握手流程数据帧日志解析组播代码协议 802.11i 功能 作用&#xff1a;派生和交换两组密钥 密钥包括ptk加解密单播数据&#xff0c;由用户设置的pmk扩展&#xff08;在setwork的时候通过pasapharse生成&#xff09; gtk加密解组播数据…