深入Java虚拟机--Class文件结构

平台无关性与class

  想要学习Java虚拟机,了解class文件是非常必要的。
  一开始,编程语言在不同平台都是独一份的,就是你在windows操作系统上,使用的指令集为x86,那么你的代码在别的操作系统上或者使用别的指令集的cpu就运行不起来。这是因为编程语言需要编译成机器码,对应cpu的指令集运行。不同cpu拥有不同的指令集,如果编程语言编译完之后直接操作指令集和系统api的话,哼哼。
Java虚拟机提供的语言无关性
(图片引自百度,侵删)
  起初Java的卖点就是跨平台性,也就是所谓的“一次编写,到处运行”。为了实现编程语言的平台无关性,Java在操作系统和编程语言之间加了一层虚拟机,屏蔽了语言和系统底层。Java将写好的代码编译成Java虚拟机可识别的class文件(注意,如图其他语言编译成的class文件格式语法都是一样的,虚拟机只能识别class文件),加载进虚拟机。
这里写图片描述
这里写图片描述
((不同操作系统为什么使用不同jdk?是因为编程语言与系统底层的耦合转移到jvm上了吗?待查阅资料后再说))

Class文件结构

  对于class文件结构的表述,只用文字的话应该是太抽象了。其实我觉得学习应该是良好的图片描述加上文字说明这样学习的效果才更好。

示例程序

public class User{

    public String name;

    public void login(){
    }

}

使用十六进制编辑器winHex打开这个class文件
Java Class文件结构

  • 开头4个字节用16进制表示是0xCAFEBABE,称为魔数,用于识别class文件。用于识别这个class文件是否正确。
  • 接着4个字节是Java的版本号,5、6字节是次版本,7、8字节是主版本。将0x0034 转换成十进制52就是Java版本。Java1.7是51或50,图中的应该是jdk1.8。
  • 接下来是常量池计数值, 0x0013十进制是19,代表着有18个常量(加上计数值就19),计数是从1开始,0代表“不引用任何常量池项目”。

常量池

常量池存的是啥?
这里写图片描述

动态连接
class文件引用方法,字段没有保存最终内存地址,只是有一个方法名类名而已。
虚拟机运行时,再进行动态连接。
接下来就是常量项,不同常量项有着不同格式。。。。
这里写图片描述

javap反编译后实例,看着实例捋一遍。
常量池后是类的访问标志,不同状态是不同的16进制数,然后做位或运算得到最终标志
然后是类,父类,接口索引
然后讲字段表集合,方法表
最难的是属性
还有字节码指令

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值