Java类文件.class详解

一、编译型语言和解释型语言的区别

1、编译型语言:

在编译型语言中,源代码会被整个编译成机器码或者中间代码(比如Java的字节码),生成可执行文件。
运行程序时,不需要再对源代码进行解释,而是直接执行生成的可执行文件。
典型的编译型语言包括C、C++等,它们在执行时需要依赖特定平台的编译结果。

2、解释型语言:

解释型语言的源代码在运行时会逐行或逐段被解释器解释执行,而不是提前编译成可执行文件。
解释型语言的执行速度通常比编译型语言慢,因为每次执行都需要解释器实时解释源代码。
典型的解释型语言包括Python、JavaScript等,它们不需要生成可执行文件,而是直接在解释器中运行源代码。

3、Java 程序从源代码到运行的过程:

在这里插入图片描述

  • 所以说Java是解释和编译共存的一种语言。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。
  • 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
  • 在Java中,JIT编译器是Java虚拟机的重要组成部分,负责将Java字节码转换成本地机器码,以便在特定平台上执行。在保持Java跨平台特性的同时,通过动态编译提高了程序的执行性能(JIT编译器在程序运行时动态生成本地机器码)。JIT编译器JIT编译器通常会使用各种优化技术,如方法内联、循环展开、常量传播等,以提高生成的机器码的效率和性能。支持动态特性是AOT不具有的。

二、class 文件的组成。

根据 Java 虚拟机规范,Class 文件通过 ClassFile 定义,ClassFile 的结构如下:

ClassFile {u4             magic; //Class 文件的标志u2             minor_version;//Class 的小版本号u2             major_version;//Class 的大版本号u2             constant_pool_count;//常量池的数量cp_info        constant_pool[constant_pool_count-1];//常量池u2             access_flags;//Class 的访问标记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];//属性表集合
}
  1. 魔数(Magic Number):
    .class文件的头四个字节是固定的魔数,用于识别文件是否为有效的Java类文件。通常情况下,这四个字节的数值为0xCAFEBABE。
   u4             magic; //Class 文件的标志
  1. 版本号(Version):
    魔数之后的四个字节表示.class文件的版本号,包括主版本号和次版本号。主版本号表示Java编译器的版本,次版本号表示编译器的次要版本。
    u2             minor_version;//Class 的小版本号u2             major_version;//Class 的大版本号
  1. 常量池(Constant Pool):
    常量池是.class文件中一个重要的部分,用于存储编译后的字节码中所用到的符号引用、字面量等信息。常量池中的内容包括类名、方法名、字段名、字符串常量等。
    u2             constant_pool_count;//常量池的数量cp_info        constant_pool[constant_pool_count-1];//常量池
  1. 访问标志(Access Flags):
    访问标志指示了该类或接口的访问权限,比如public、private、protected等。
    u2             access_flags;//Class 的访问标记
  1. 类信息:
    包括类的名称、父类的名称、实现的接口等信息。
    u2             this_class;//当前类u2             super_class;//父类u2             interfaces_count;//接口数量u2             interfaces[interfaces_count];//一个类可以实现多个接口
  1. 字段信息:
    描述了类中的字段,包括字段名称、字段类型、访问标志等。
    u2             fields_count;//字段数量field_info     fields[fields_count];//一个类可以有多个字段
  1. 方法信息:
    描述了类中的方法,包括方法名称、参数列表、返回值类型、访问标志等。
    u2             methods_count;//方法数量method_info    methods[methods_count];//一个类可以有个多个方法
  1. 属性表集合(Attributes):
    u2             attributes_count;//此类的属性表中的属性数attribute_info attributes[attributes_count];//属性表集合

每个类、字段或方法都可以包含一些属性信息,比如源文件名、行号表、局部变量表等。
以上是.class文件的主要组成部分,它们共同构成了Java编译后的二进制表示形式,被Java虚拟机加载和执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RockChip Android13 NFC SL6320移植

环境:RK3568 Android13 一:驱动移植 1、驱动 将SL6320驱动代码拷贝至kernel-5.10/drivers/misc/sl6320/ 特殊说明:勿将驱动代码放置于kernel-5.10/drivers/nfc/目录下,会导致sl6320驱动生成设备节点时因/dev/nfc节点以创建而加载失败。 2、DTS 本次硬件设计电路走I2C协…

服务器数据恢复—多块磁盘离线导致阵列瘫痪,上层lun不可用的数据恢复案例

服务器存储数据恢复环境: 某品牌MSA2000存储,该存储中有一组由8块SAS硬盘(其中有一块热备盘)组建的RAID5阵列,raid5阵列上层划分了6个lun,均分配给HP-Unix小型机使用,主要数据为oracle数据库和O…

【LeetCode刷题】34. 在排序数组中查找元素的第一个和最后一个位置

1. 题目链接 34. 在排序数组中查找元素的第一个和最后一个位置 2. 题目描述 3. 解题方法 找到元素的第一个位置,也就是找大于等于目标的最小值找到元素的最后一个位置,也就是找小于等于目标的最大值可以利用2次二分查找来解决 3.1. 第一次查找 3.2. …

今日详解,教你如何不直播在视频号卖货

大家好,我是电商笨笨熊 视频号作为背靠微信的平台,从不需要考虑自身的流量问题, 因此在视频号推出之后就有大批的主播从其他平台转入视频号; 而这时候很多普通人应该也发现了新的机会,不再去内卷抖音、快手直播&…

【Git】Github创建远程仓库并与本地互联

创建仓库 点击生成新的仓库 创建成功后会生成一个这样的文件 拉取到本地 首先先确保本地安装了git 可以通过终端使用 git --version来查看是否安装好了git 如果显示了版本信息,说明已经安装好了git,这时候我们就可以进入我们想要clone到问目标文件夹 …

python-正则表达试-实践1

匹配html标签中的任意标签内数据 匹配所有包含’oo’的单词 import re text "JGood is a handsome boy, he is cool, clever, and so on..." re.findall(r\w*oo\w*, text) 匹配 html中title里面的内容 原文: import re file r./202304.html f open(…

2023数维杯A题原创完整论文思路和求解代码

河流对地下水有着直接地影响,当河流补给地下水时,河流一旦被污染,容易导致地下水以及紧依河流分布的傍河水源地将受到不同程度的污染,这将严重影响工农业的正常运作、社会经济的发展和饮水安全。在地下水污染中最难治理和危害最大的是有机污染,因而对有机污染物在河流-地下…

WordPress Automatic插件 SQL注入漏洞复现(CVE-2024-27956)

0x01 产品简介 WordPress Automatic(又称为WP Automatic)是一款流行的WordPress插件,旨在帮助网站管理员自动化内容创建和发布。该插件可以从各种来源(如RSS Feeds、社交媒体、视频网站、新闻网站等)获取内容,并将其自动发布到WordPress网站。 0x02 漏洞概述 WordPres…

从论文中看AI绘画

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 主要看是看Diffusion Models,CLIP,ControlNet,IP-Adapter这种经典论文,尝试总结论文写作的一些方式以及图像生成模型的一些内在思想. 对于其中的数学原理和代码不过深究. DDPM 使用扩散模型得到高质量图像,证明了这…

“给力”用日语怎么说?柯桥成人日语培训

在日语中,给力这个词可以翻译成几个不同的表达方式,具体取决于语境。以下我将给出几个常见的日语翻译以及例句帮助理解: スゴイ 这个词意思为“太棒了”,是表达给力的最常见说法。 例如: これはスゴイ映画だね。这电影太给力了! 最高 意思为“最棒的”,也可以用来表达给力。 例…

连锁店收银系统为什么贵

连锁店收银系统会比单机收银系统价格高一些,主要有三个方面的原因: 复杂的功能需求 连锁店收银系统需要管理多个分店的进销存、库存调拨、门店订货等操作,以及会员管理,商淘云连锁收银系统还提供了连锁线上商城等功能。这些功能的…

“胖猫”事件

1.她自以为手段高明,不过是他心甘情愿罢了。 2. 可惜他在最后一刻,也没怨恨过她。 3.她反复确定用不用还,他反复确定有没有爱。 4. 他才21岁,只想见你一面,有什么错。 5. 希望你学会爱的时候,爱的第一个人是…

csrf攻击(跨站请求伪造)【2】

1.DVWA中csrf漏洞验证low (1)受害者将密码更改为password,显示更改成功 (2)受害者未退出登录状态,打开了新链接(黑客设计好的修改密码为admin123(原本为passwrod)的链接),导致受害者密码被更改&#xff0c…

Python-VBA函数之旅-pow函数

目录 一、pow函数的常见应用场景 二、pow函数使用注意事项 三、如何用好pow函数? 1、pow函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博客 一、pow函数的常见应用场景 Py…

【Web】CTFSHOW 中期测评刷题记录(1)

目录 web486 web487 web488 web489 web490 web491 web492 web493 web494 web495 web496 web497 web498 web499 web500 web501 web502 web503 web505 web506 web507 web508 web509 web510 web486 扫目录 初始界面尝试文件包含index.php&am…

COUNT(1)\COUNT(*)\COUNT(列名)到底谁更快

今天来研究一个比较有趣的话题,关于我们平常使用mysql查询数量的到底那种方式查询效率更高的问题 起因 这个问题在我以前的认知里是,按效率从高到低品排序 count(1)>count(列名)>count(*),但是我也注意到过mybatis-plus官方提供的selectCount方法和分页查询时,它的SQL在…

Linux(openEuler、CentOS8)企业内网DHCP服务器搭建(固定Mac获取指定IP)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文&#xff09;---- 目录 一、知识点二、实验&#xff08;一&#xff09;为服务器配置网卡和IP&#xff08;二&#xff09;为服务器安装DHCP服务软件&#xff08;三&a…

openGauss学习笔记-273 openGauss性能调优-实际调优案例02-调整I/O相关参数降低日志膨胀率

文章目录 openGauss学习笔记-273 openGauss性能调优-实际调优案例02-调整I/O相关参数降低日志膨胀率273.1 调整参数前的参数值273.2 调整参数后的参数值openGauss学习笔记-273 openGauss性能调优-实际调优案例02-调整I/O相关参数降低日志膨胀率 273.1 调整参数前的参数值 page…

[技术小技巧] 可视化分析:在jupyter中使用d3可视化树形结构

首先在python中定义一个字符串&#xff0c;记录d3.js绘制属性图的js脚本代码模版。其中{{data}}就是将来要被替换的内容。 d3_code_template """ // 创建树状结构数据 var treeData {{data}};// 创建d3树布局 var margin { top: 20, right: 90, bottom: 30,…

leecode每日一练

打家劫舍 我一开始的思路也是dp&#xff0c;但是转移方程想错了&#xff0c;这个题目转移方程应该是dp[i] max(dp[i-2]nums[i],dp[i-1]) class Solution { public:int rob(vector<int>& nums) {int len nums.size();vector<int> dp(len);int ans 0;if(len&g…