您的位置:首页 > 编程语言 > Java开发

Java 的 Class 文件格式——解析魔数和版本号

2006-08-16 17:12 821 查看
解析 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编程中的三种低级用户界面事件处理技术比较         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息