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

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

作者:陈跃峰

出自:http://blog.youkuaiyun.com/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);

       }    

}

华为OD机试真题 新系统 9月16号 【统计特殊数字】 华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。 阅读详情

相关推荐

基于Matlab的MIMO通信系统仿真_Simulink实现

瑞利衰落信道中使用空时分组码的BPSK调制的BER 1、2发1收 参数设置: 双极性信号元+1和-1,每符号含1bit; 采样时间=符号时间=1s; 采用基于数据帧的仿真计算模式,每帧中有2个采样值; 仿真时间=出现100个误码后停止仿真; 随机整数种子=22; Jakes衰落模型中每个信道上的多普勒频移=0.01Hz; 输人信号功率=2W; Alamouti码:两根发送天线,一根接收天线(分集阶= 2); 平均信道信噪比= 18dB; 仿真得出的误码率统计BER =0. 00017. 2、2发

太阳帅帅的博客 9688

java class文件魔数、版本号

每个class文件的前四个字节表示魔数,他的唯一作用是确定这个文件是否是一个能被虚拟机接受的class文件, 很多文件存储标准中都使用魔数来进行身份识别,比如图片格式,如gif、jpg等在文件中都存在魔数,使用魔数而不是扩展名来进行识别主要基于安全方面的考虑。因为扩展名可以随便改动。文件格式的制定者可以自有的选择魔数值。紧接着魔数的4个字节后,第5个和第6个表示次版本号。第7、8表示主版本号。如下...

qq_36028303的博客 1348

U2Net网络实战:从原理到代码实现(附背景去除应用)

本文深入解析了U2Net网络的原理与代码实现,重点剖析了其独特的嵌套U型结构(RSU模块)和显著图融合机制。通过实战演示,指导读者如何加载预训练模型并应用于精准的图像背景去除任务,为电商、摄影等领域提供高效的自动化抠图解决方案。

nn3456的博客 491

java之class文件解析

前言   我们知道java文件在经过编译之后就会生成字节码文件,即.class文件。随后.class文件就会被对应类加载器加载到内存中。那么是不是存在这么一种可能,我自创一种编程语言,然后使用自己的编译器将其编译成为JVM所识别的.class文件,是不是也可以运行在JVM中呢?答案是肯定的。   其实运行在JVM之上的编程语言不止Java一种,还有像groovy、kotlin、scala这些语言都是运行在JVM之上的,这些不同的语言的语法肯定是不同的,但是这些语言在经过各自的编译器进行了编译之后生成的.cl

qq_44778026的博客 9177

C51红外接收与发射控制及原理编码与解码

基于38khz的NEC协议红外发射简易电路图NEC协议产生红外光数据编码 0 1结合程序红外接收接收电路解码过程解码代码 红外发射 通过通过红外二极管发射红外光,三极管的状态来控制。 红外模块一般都是三个引脚,vcc,gnd,dat,通过控制dat口的来控制发射红外光。 简易电路图 将数据口连接到单片机的引脚为上,控制io口的电平状态,来控制三极管的导通状态,从而发射红外光。 NEC协议 NEC协议特点:8位地址和8位命令为提高可靠性,地址和命令都传输2次,脉冲间隔调制38kHz载波频率。 包含引导码,

yangfeng20的博客 1万+

因果推断综述-A Survey on Causal Inference

最近读到一篇讲述很全面的综述文献-《A Survey on Causal Inference》,对于接触因果推断不久的同学而言是特别详细的介绍和科普。文献很长,我会分成几部分介绍。 目录 摘要 第一部分:简介 第二部分:因果推断基础知识 第三部分:基于三种假设的因果推断方法 第四部分:实验 第五部分:应用 摘要 几十年来,因果推理是一个跨许多领域的关键研究主题,如统计、计算机科学、教育、公共政策和经济学。与随机对照试验相比,研究方向由于可用数据量大且预算要求低,如今,从观测数据..

海边凝望的博客 3185

class文件格式的理解

以前了解JVM相关知识时,对类文件结构仅仅是一瞥而过,并未仔细去深究,实在不应该。于是最近找了个闲暇,来仔细理解一下。 先不谈各种定义,就现象而言,class文件只是开发者编译java文件产生的产物,且这个产物是供JVM阅读的。 class文件于Java程序员自然随手可拾,当使用文本编辑器打开的时候却是这样的: cafe babe 0000 0034 003d 0a00 1100 2909 001...

明光的博客 801

在LangChain中使用DashVector进行高效向量检索

DashVector为需要处理高维向量数据的开发者提供了一种便捷且高效的解决方案。通过将其集成到LangChain生态系统中,您可以轻松实现复杂的语义搜索和数据分析功能。DashVector官方文档LangChain GitHub仓库有关DashVector的详细notebook示例。

sjufgwgfhoia的博客 456

JVM—Class类文件结构详解

要了解Class文件的结构首先得了解Class文件所采用的数据类型:Class文件格式采用一种类似C语言结构体的伪结构来存储数据,这种伪结构只有两种数据结构,即和,解析Class文件全是以这两个数据结构为基础。

cjergfgp的博客 1187

S32K1XX调试--快速定位HardFault

1、背景 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。 2、分析 要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。 根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了 根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。 3、问题查找 提供一种不需要懂汇编指令的查找方法,方法如下: 在中断处理函数中插入以下代码,以及另外定义

ping_devil的博客 4020

32、运算放大器的工作原理与应用

本文详细介绍了运算放大器的工作原理与多种应用场景,涵盖开环与闭环放大器的基本概念、理想运算放大器的特性及其‘黄金规则’。文章深入解析了反相放大器、同相放大器、单位增益跟随器与反相器的配置和增益计算,并探讨了电压比较器及窗口比较器的工作机制。同时提供了运算放大器在实际应用中的选型流程、使用注意事项以及常见故障排查方法,帮助读者全面掌握运算放大器的设计与应用要点。

u5v6w7的博客 164

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

解析 Java 的 Class 文件格式——解析魔数和版本号 作者:陈跃峰 出自: http://blog.csdn.net/mailbomb           熟悉 Java 语言有好几年了,技术也学了一些,现在主要从事 J2ME 技术方面的工作,最近工作不是很忙,就找了本电子书——《深入 Java 虚拟机 ( 第二版 ) 》,仔细阅读了一下,读起来比较吃力,现在把 Java class 文件

seeknow的专栏 2150

『OPEN3D』1.2 mesh处理 python篇

介绍open3d对mesh的基本处理操作

NNNNNathan的博客 4648

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

熟悉Java语言有好几年了,技术也学了一些,现在主要从事J2ME技术方面的工作,最近工作不是很忙,就找了本电子书——《深入Java虚拟机(第二版)》,仔细阅读了一下,读起来比较吃力,现在把Java class文件格式的读书笔记共享给大家。    众所周知,Java语言的可执行文件是class文件,俗称类文件。这个文件为了让不同平台的虚拟机都能够正确的解释,详细规定了其文件格式。下面就按照顺序进

香蕉熊的专栏 1066

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Class 文件的魔数和文件版本号

一 Class 文件数据类型 数 据类型 定义 说明 无符号数 无符号数可以用来描述数字、索引引用、数量值或按照 utf-8 编码构成的字符串值。 其中无符号数属于基本的数据类型。 以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节和 8 个字节 表 表是由多个无符号数或其他表构成的复合数据结构。 所有.

实践求真知 1006

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Class文件结构介绍[魔数版本号]

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!程序员代码面试指南 IT名企算法与数据结构题目最优解这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!

2401_84413531的博客 1254

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【JVM】class文件结构1——魔数、版本号、常量池与类访问标记

1、魔数 我们可以利用editplus,以16进制的编码格式来查看class文件的结构,具体操作方法为在editplus的工具栏中点击Edit,下拉选择Hex Viewer即可。 如图所示,前四(4个bit位*8个字母=32,32/8=4字节)个字节为0xCAFEBABE,这就是class文件的魔数。 虚拟机借助魔数,用来识别.class 文件,虚拟机在加载类文件之前会先检查魔数,如果不是 0xCAFEBABE 则拒绝加载该文件。 关于class文件魔数的由来,可以参考这篇文章class文件魔数

阳阳的博客 1397

字节码一:Class文件的结构、魔数与版本号

一、Class文件的结构 学过java都知道,java是跨平台的,“一次编译,到处运行”是java诞生之时就有的口号。原因就在于“字节码”。 各个不同平台的虚拟机和所有平台都统一的使用字节码这种格式存储,就是构成平台无关性的基石。另外要说的一点是Class文件并不是说只有java程序会生成,也就是说java虚拟机并不是指只有java语言才能运行。只要是在经过编译后生成符号虚拟机规范的Class文件,都可以在java虚拟机中运行!如果JRuby,Groovy等(反正我也没用过)。 至于什么是符合虚拟机规

qq_27114677的博客 642

理解JAVA Class文件,破解class文件的第一步

Java虚拟机中定义的Class文件格式。每一个Class文件都对应着唯一一个类或接口的定义信息,但是相对地,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。我们只是通俗地将任意一个有效的类或接口所应当满足的格式称为“Class文件格式”,即使它不一定以磁盘文件的形式存在。

洪伟的专栏 2万+

Java类文件结构深度解析:从魔数到方法表

Java类文件结构深度解析:从魔数到方法表 【免费下载链接】jvm ???? JVM 底层原理最全知识总结 项目地址: https://gitcode.com/gh_mirrors/jvm9/jvm ...

gitblog_00235的博客 770

Java冷知识之——魔数(Magic Number)

一、 编程中的魔数 在阿里巴巴Java开发手册编程规约第二节常量定义的第一条中写道: 魔法值(即魔数)指的是未经预先定义的常量,而反例中的 “Id#taobao_” 则叫做魔字符串(Magic String)。这一规定在《Clean Code》和各大公司的代码规范手册中都有被提及过,那为什么这样规定呢? 《计算机程序的构造和解释》一书中表达过这种观点: 代码的第一要义是供人类理解,其次才是能正...

qq_41297896的博客 8446

突破性JVM魔数机制:CAFE BABE的浪漫秘密

你是否好奇,为什么Java能一次编写到处运行?为什么JVM能识别.class文件而拒绝其他格式?这一切的起点,藏在每个.class文件前4个神秘字节中——**CAFE BABE**。这个看似咖啡师暗号的十六进制数,正是JVM世界的第一道门禁,也是理解Java跨平台能力的关键钥匙。本文将带你揭开魔数机制的前世今生,从二进制层面看懂JVM如何守护代码安全,如何实现"一次编译,处处运行"的技术奇迹。 ...

gitblog_00053的博客 1173
上一篇: Nokia发布Symbian平台上C++语言的2D游戏引擎(含源代码)
下一篇: 闲话Nokia手机的S40系列
java2000_test
博客等级 码龄19年 10粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值