JVM学习之-Class File Format


上次讲JVM概述的时候说到了它是一种规范,是能够执行任何编译成Class类型文件的语言。那么Class类型的文件又是什么呢?

什么是ClassFileFormat?

class文件全名称为Java class文件,主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。
该文件打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。
——《百度百科》

简言之就是我们的java文件通过jre编译后生成的用于在JVM上执行的后缀为.class的文件。

ClassFileFormat学习

总体来说它不算是个重点内容,对于开发工作来说了不了解都没什么大问题。但既然回来复习了,那就学的深入一些。先说总结,搞明白class文件类型能使你对开发语言的了解更加清晰,明白语言与汇编与机器的交互过程,还是比较有帮助的。

首先我根据自己理解用表格表达Class文件的结构:
Class文件

写一份简单的java文件,代码如下:

public class TestClass01 {
}

build编译一下就生成了.class文件
.class
打开这个文件,发现代码如下:

public class TestClass01 {
    public TestClass01() {
    }
}

其实这里并不是这个.class文件的实际内容,而是idea自动对它进行了反编译的结果。它自动为我们生成了一个构造方法是java的语言特性。
而实际中.class文件在notpad++中打开是这个样子的:.class文件这里我推荐IDEA的Binary插件将其转换为16进制如下图:Binary

Class文件该怎么读

读class文件可以通过java自带的javap命令来查看其内容结构,我推荐IDEA中的JClasslib插件。首先将光标移动到类名,在View中就可以看到Show Bytecode With jclass的选项。

JClasslib
点开之后就会出现这个窗口,很直观的可以看到上面我说的Class文件的结构
JClasslib
然后我们反过来看Class文件的16进制,其中每两个字节为一组:
Class文件解读

  • 前两个字节为magic num,这个无需关注;

  • 后面第一个字节是minor num小版本号,第二个字节是major num大版本号,转换为十进制就52对应我的jdk1.8;

  • 0010指的是constant_pool_count常量池里的常量数量,实际常量数为constant_pool_count-1,这里就是15个。对应JClasslib中可以看到确实如此。
    常量池

接下来就是对应后面的15个常量池的字节在JClasslib中查找对应的内容,根据其描述指向对应的实现内容可以查JAVASE官方文档。过程比较复杂繁琐我就不一一放图演示了。

虽说学习Class用处不大,但通过这几个步骤的操作能让我比较直观的了解到java编译后程序是如何实现的。

这种不是很重要的知识点我以后还是尽量少发表,记录比较繁琐耗费学习时间

以上是我对ClassFileForma的学习记录,主要为我的主观理解,若有错误请指出,欢迎与我评论交流~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值