解析 Java 的 Class 文件格式——解析魔数和版本号
作者:陈跃峰 出自: http://blog.csdn.net/mailbomb
熟悉 Java 语言有好几年了,技术也学了一些,现在主要从事 J2ME 技术方面的工作,最近工作不是很忙,就找了本电子书——《深入 Java 虚拟机 ( 第二版 ) 》,仔细阅读了一下,读起来比较吃力,现在把 Java class 文件格式的读书笔记共享给大家。
众所周知, Java 语言的可执行文件是 class 文件,俗称类文件。这个文件为了让不同平台的虚拟机都能够正确的解释,详细规定了其文件格式。下面就按照顺序进行介绍:
1、魔数 (magic) 为了方便虚拟机识别文件是否是 class 格式的文件, SUN 公司规定每个 class 文件都必须以一个 word(4 个字节 ) 来开始,这个数字就称为魔数。魔数是有 4 个字节的无符号数字构成的,而且规定魔数必须是 0xCAFEBABE 。
2、版本号 (version) 魔数后续的内容就是一个 word 的长度来表示生成的 class 文件的版本号,版本号分为主版本号和次版本号,其中前两个字节表示次版本号,后两个字节表示主版本号,排列的顺序遵从高位在前,低位在后的原则。
下面我写了一个很简单的示例代码,从一个名字为 First.class 文件中读取到这些信息,然后输出出来,不足之处请大家指正!
该程序的代码如下:
import java.io.*;
/** * 解析 class 文件格式 */
public class ParseClassFile
{
public static void main(String args[]){
try{
// 读取文件数据 , 文件是当前目录下的 First.class
FileInputStream fis = new FileInputStream("./First.class");
int length = fis.available();
// 文件数据
byte[] data = new byte[length];
// 读取文件到字节数组
fis.read(data);
// 关闭文件
fis.close();
// 解析文件数据
parseFile(data);
}catch(Exception e){
System.out.println(e);
}
}
private static void parseFile(byte[] data){
// 输出魔数
System.out.print(" 魔数 (magic):0x");
System.out.print(Integer.toHexString(data[0]).substring(6).toUpperCase());
System.out.print(Integer.toHexString(data[1]).substring(6).toUpperCase());
System.out.print(Integer.toHexString(data[2]).substring(6).toUpperCase());
System.out.println(Integer.toHexString(data[3]).substring(6).toUpperCase());
// 主版本号和次版本号码
int minor_version = (((int)data[4]) << 8) + data[5];
int major_version = (((int)data[6]) << 8) + data[7];
System.out.println(" 版本号 (version):" + major_version + "." + minor_version);
}
}
作者Blog: http://blog.csdn.net/Mailbomb/ 相关文章 闲话Nokia手机的S40系列 解析Java的Class文件格式——解析魔数和版本号(一) J2ME低级界面题目——测验你的J2ME技术能力如何? 一个生成无重复数字的代码 J2ME编程中的三种低级用户界面事件处理技术比较