带你看看Java虚拟机的Class文件

发表于 2年以前  | 总阅读数:491 次

今天聊聊Class文件,也就是字节码文件的一些知识,保准新手小白也能看懂,只要不走神……

什么是Class文件

首先大家要搞清楚,什么是Class文件,我们看一个代码,比如这里有一个Java源文件,内容是:

public class TestDemo {
   public static void main(String[] args) {
       System.out.println("hello");
  }
}

这没什么问题吧?此时这个文件存放在我的桌面:

此时我们打开命令行工具,输入以下指令:

此时就会在我们的桌面生成一个新的文件:

这就是Class文件!同时我们一般把它叫做字节码文件,这才是真正实现跨平台的东西,到了这里你就需要明白,Class文件和字节码文件是一回事!

那什么是字节码文件:

所谓的字节码文件就是Java源代码经过编译器(javac)编译之后生成的新的文件,也就是一个后缀为.class的文件,此文件是一种二进制的类文件,它的内容是JVM指令,此文件就是字节码文件!

ok,以上就是对字节码文件的解读!

那到了这里,肯定就会有人比较好奇,这个字节码文件里面是什么内容啊,我们可以使用文本工具将其打开看一下:

一般,我们用常规的文本编辑工具直接打开,它是无法识别的,比如这里我们就要打开它:

然后你看的就是这些,啥也不是,完全看不懂,一堆乱码,怎么办?(虽然我们看不懂,但是JVM看得懂)

一般来说我们会将其以**十六进制的形式打开**,如下:

看到的就是这样的,其实你还是会觉得看不懂,没关系,我们后面就会着重去分析这些都是什么意思,也就是搞清楚这个字节码文件到底是个啥?

怎么去查看Class文件

我们上面对Class文件也即字节码文件有了基本的认识,那么现在我们怎么去查看这个Class文件呢?上面我们说了,Class文件如果我们用一般的文本编辑器去打开的话,是乱码,什么也看不懂,通常情况下,我们以十六进制的形式展现

也就是上述这个样子,也即是说,对于Class文件,我们直接打开显示的是这样子的:

看不懂啊,就好比你不会英语,给你一段英语,你看不懂啊,怎么办?翻译啊,可以将其翻译成中文你不就看懂了嘛,同样的,对于原始的Class文件,我们直接打开是看不懂的,怎么办?也是翻译啊,翻译成啥?通常翻译成十六进制的形式,也即是这样:

这样看就友好多了,当然,它是无法直接翻译成中文的,只能翻译到这了,那接下来我们就需要去解读这些十六机制代码都是什么含义,也就是去解读这个Class文件内容,这是我们的重点!

那这里先给大家介绍下,如何去查看这个Class文件,我用的工具叫做“010 Editor”(只要是十六进制文本编辑器都可),觉得还是很强大,很方便的,直接打开Class文件,这里可以进行转换:

而且在这里可以进行更多格式的切换:

比如我们将其以二进制形式展现:

可以看到,二进制直接展现看着也是比较懵的,还是十六进制的形式比较友好,所以这个工具推荐给大家,已给大家准备好安装包,除此之外大家还可以使用比较常见的编辑工具比如notpad++或者是sublime等,这些工具都可以以十六进制形式展示文件内容!

OK,我们看到的这些十六进制形式的内容可以说是Class文件的原版本,还有一些工具可以直接将Class文件进行解读以后将内容展现给我们,比如有这么一款工具(学习JVM必备:https://github.com/ingokegel/jclasslib)。叫做“JClasslib”,这就是一个专门的字节码查看器,我们用它打开Class文件:

这里展示的信息就是对Class文件进行解读之后的,更加方便我们去看,去分析,这款工具有Windows客户端,同时我们可以在IDEA中安装这款工具插件:

安装完这个插件之后,我们将代码进行编译之后,就可以点击View:

打开该工具就会在右边显示该Class文件内容解读:

ok,目前就给大家介绍这些方式,后面我们会用到这些去给大家分析Class文件的内容!

这里再给大家强调一下,可以这么说,原汁原味的Class文件也即是字节码文件是这样子的

我们要分析的也是这个!OK!

分析十六进制文件

接下来我们就来分析一下这个全是数字和字母的十六进制文件,这个就是Class文件了,也叫作字节码文件,我们看看这些东西该怎么解读!

首先清楚,这个字节码文件中大致包含如下几部分:

  1. 魔数
  2. Class文件版本
  3. 常量池
  4. 访问标志
  5. 索引集合
  6. 字段表集合
  7. 方法表集合
  8. 属性表集合

接着我们以常量池为例来分析一个案例,让你理解这个字节码文件的分析是怎样的~

首先要知道,常量池也是存储数据的一个结构,它的结构如下:

{
 u2         constant_pool_count;
 cp_info    constant_pool[constant_pool_count - 1]
}

这个u2就是Class文件中的一个数据类型,代表2字节大小,所以常量池就包含了两部分:

  1. 常量池的大小,也就是常量池计数器(常量池包含常量池计数器),比如为5,真正的常量池索引为1-4,因为0索引被保留了
  2. 常量池项集合,就是具体的常量池中的各个内容了,也就是字面量和符号引用这些

而对于不同的字面量和符号引用,都还有各自的一个类型,比如同为字面量的整数6和字符串6,但是前者类型是int后者类型是String,所以不同的数据有不同的类型,别看常量池主要保存的就是字面量和符号引用,但是拆开仔细一看,这两者包含的数据一共有17种类型(截止jdk13),如下:

我们以CONSTANT_Integer_info为例,它就代表我们常见的int类型,每一个常量项同时也是有两部分组成,通用表示如下:

cp_info{
 u1 tag; //表示类型
 u1 info[]; //表示内容的字节数组
}

比如这个常量项“CONSTANT_Integer_info”,我们常见的int类型就属于这个常量项,看它的组成就是:

CONSTANT_Integer_info{
 u1 tag;
 u4 bytes[];
}

这是怎么回事呢?比如我们这里写的Java代码(源java文件):

public class TestDemo {
   public final int a = 6;
   public static void main(String[] args) {
       System.out.println("hello");
  }
}

这里我们定义了一个final整型常量a,值为“6”,那这里的这个“6”就是一个字面量,是要放在常量池中的,对应的常量池结构就是CONSTANT_Integer_info,而CONSTANT_Integer_info包含两个部分,首先是占1字节的tag就是一个u1大小的类型,这个数值固定是3,然后就是占4个字节的具体存储字面量数值的字节数组info了!

我们目前查看Class文件是以16进制查看的,那么这里的字面量“6”是十进制,需要将其转换成十六进制放进常量池,十六进制为“0x06”:

那这个十进制的字面量“6”在常量池中的布局结构就如下所示:

这个时候我们再查看上述举例的源Java文件生成的Class文件,也就是十六机制的文件:

可以发现,这个字面量6正如咱们分析的一样出现在了字节码Class文件当中!这就将我们写的java代码中的变量与这个Class文件中的内容对应了起来!

当然,上述只是举了一个例子,实际上Class文件的内容很多,分析起来也比加多复杂,以上只是让大家简单了解一下!

如果想系统全面的学习,可以关注下咱们的Java就业手册,持续更新中……

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/R76RNqxmFzqJqUE9SGqW_A

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Java 中验证时间格式的 4 种方法 2年以前  |  3805次阅读
Java经典面试题答案解析(1-80题) 4年以前  |  3587次阅读
CentOS 配置java应用开机自动启动 4年以前  |  2755次阅读
IDEA依赖冲突分析神器—Maven Helper 4年以前  |  2743次阅读
SpringBoot 控制并发登录的人数教程 4年以前  |  2422次阅读
 目录