Java字节码的文件结构解析

1、字节码文件产生缘由

java语言在其诞生之初就有一句口号:“一次编写,到处运行”,这句话也表达了大多数开发人员对于冲破平台界限的一种渴望,因为以前的编程语言都不支持跨平台运行。就拿C语言作为一个例子,我们知道在不同的操作系统中的cpu指令集是不一样的例如windows只支持x86系列,linux即有支持ARM的,也有支持x86的,这就导致一个结果——C语言在不同操作系统编译后产生的二进制序列运行效果是不一样的,它就必须得在不同的操作系统上安装不同的编译器才能在不同的操作系统上运行。而Java则用了一个虚拟机的概念,Java的源代码经过编译后产生.class为后缀的文件,这就是我们所说的字节码文件。
用一小段代码进行演示(本文其它部分也用该段代码进行讲解):
源代码TestClass.java:

package org.fenixsoft.clazz;
public class TestClass{
	private int m;
	public int inc(){
		return m+1;
	}
}

用javac命令进行编译生成TestClass.class文件,然后用winhex这个16进制编辑器进行查看
在这里插入图片描述
这种文件可以在所有的Java虚拟机上运行,不管你是什么操作系统。从而实现跨平台运行,虽然不同平台的Java虚拟机的实现各不相同。这种虚拟机是真实操作系统的一个抽象,逻辑上可以理解为一个独立的平台,利用这个平台实现跨操作系统运行。
除了平台无关之外,Java虚拟机还实现了语言无关,因为Java虚拟机只和class文件具有“绑定关系”,但是除Java语言外的其它语言如果能编译成class文件的话也能在虚拟机上运行。已经有JRuby和Groovy等语言能在Java虚拟机上运行。
总的来说,虚拟机的引入是实现平台无关性和语言无关性的一个关键,对与字节码文件的研究对于理解Java和Java虚拟机有很大的帮助,下面我们就来深入理解一下这个字节码文件的结构。

2、class类文件结构

Java的class文件时一组以8位的字节为基础单位的二进制,根据Java虚拟机规定,Class文件格式采用一种类似c语言的结构体来存储数据,这种伪结构中只有两种数据类型:无符号数和表。

  • 无符号数:数据基本的数据类型,以u1、u2、u4、u8分别表示一个字节,2个字节,4个字节和8个字节的无符号数,它可以用老表示数字,索引、数据值或者按照utf-8编码的字符串。
  • 表:由多个无符号数或者其它表作为数据项构成复合数据类型

2.1、魔数和class文件版本

我从这里开始逐字节分析class文件。每个class文件的头4 个字节称为“魔数”,它的作用的标注文件类型,确定这个文件是否是能被虚拟机接收的class文件,虚拟机之所以不用文件后缀名作为判断依据的原因是文件后缀名可以任意改动。例如本文中TestClass.class文件中的魔数是:0xCAFEBABE(咖啡宝贝…),这个魔数在Java还被称为Oak的时候就已经被定下来了。Java的商标大概就是因此定下来的。
紧接着魔数的下面

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值