大学的时候,就看过java虚拟机规范第二版,最近把最新的Java虚拟机规范第三版(java se 1.7版本)温习了一遍,发现java虚拟机规范中java class的文件结构部分并没有太大的变化,顺便也整理了一下。
java语言是跨平台的,所谓一次编写,到处运行。之所以是跨平台的,就是java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用java class文件来表示的,java class文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的,在linux系统或者在windows系统上都是一致的。这个就好比html文件,我们定义好规范,这个系统只要去按照规范显示出来里面的内容就好了。好比html就是class文件,浏览器就是虚拟机一样,通过浏览器去执行html的渲染过程,我们无论是用手机,Windows系统,苹果系统上网,显示出来的内容都是一样。 java虚拟机可以从class文件中加载预定义的字节码,也可以从网络,数据库,消息文件中加载字节码。
下面来说说java class的文件结构,java class文件结构是基于字节流的,用unicode进行编码。其实想想也可以完全用xml文件表示,只不过用xml表示的字节码文本体积可能会很大,占用空间,同时解析起来比较耗时,而且很容易被人为修改,导致未知错误。下面是class文件的内部结构
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
简要解释一下:
U4 代表由无符号四个字节组成
u4 magic :是一个固定的数值,java虚拟机里面称为魔数 ,主要是用来标识是否为java虚拟机所支持的文件结构,目前是0xCAFEBABE
u2 minor_version; u2 major_version; 代表次版本号和主版本号
u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; 这里面代表常量池个数以及常量池信息
u2 access_flags : 代表class访问标记,例如:public protected
u2 this_class : 代表这个类的名称 例如 java.lang.Object
u2 super_class : 代表父类名称
u2 interfaces_count; u2 interfaces[interfaces_count]; 实现的接口格式以及接口类名
u2 fields_count; field_info fields[fields_count]; 字段个数以及字段信息
u2 methods_count; method_info methods[methods_count]; 方法个数以及方法信息
u2 attributes_count; attribute_info attributes[attributes_count]; java class文件内部属性信息,和java语言定义的属性没有关系,纯粹就是给java虚拟机用的
以上都是java虚拟机规范中定义的class文件内部结构信息,可以参考 Java虚拟机规范 (Java SE 7版)这里就不细讲
每种结构又都定义了自己的结构信息,例如:常量池结构,字段信息,方法信息,类信息,这几种结构之间又都互相引用,下面这幅图简要介绍了java class文件的内部结构信息
其中常量池的里面的信息最为复杂,java虚拟机运行时刻的所有信息都是从常量池来获取的,常量池定义了一下几种结构
分享到:
相关推荐
本文将深入探讨Java Class文件的内部结构,帮助理解其工作原理。 首先,每个Java Class文件都以一个特定的魔数(Magic Number)开始,即`0xCAFEBABE`,这个值用于识别文件是否为Java虚拟机(JVM)可识别的格式。...
为了实现一个有效的JavaClass文件校验器,首先需要深入了解JavaClass文件的内部结构。 #### JavaClass文件结构介绍与分析 JavaClass文件是由Java编译器处理Java源代码文件后生成的,最终由Java虚拟机(JVM)解释...
为了查看和理解Class文件内部的源代码,我们就需要使用到反编译工具。本文将详细介绍Java Class文件反编译工具——jd-gui。 jd-gui是一个开源的Java反编译工具,由Jikes项目开发者创建。它允许开发者在图形用户界面...
首先,让我们深入了解一下Java Class文件的结构。一个.class文件包含了Java程序的基本结构单元,如类、接口、字段和方法定义。它采用特定的字节码格式,使得虚拟机(JVM)能够理解并执行其中的指令。这些字节码由一...
总而言之,Java解析Class文件涉及到Java虚拟机的内部运作机制,包括类的结构、方法、字段、异常处理以及模块系统等。掌握这些知识能够帮助开发者更高效地进行代码优化、逆向工程以及开发基于字节码的框架。通过学习...
### JAVA Class 文件结构详解 #### 一、概述 在Java编程语言中,`.class`文件是一种重要的二进制文件格式,用于存储Java类的编译结果。这些文件由Java编译器生成,并作为Java虚拟机(JVM)执行的基础。本文将深入...
"JAVA CLASS文件查看器"就是这样一个工具,它的主要功能是解析并显示这些二进制类文件的内容。 这个工具的特点是小巧和绿色,意味着它不会占用大量硬盘空间,且无需安装即可使用,用户只需下载解压后即可开始操作。...
同时,固定的结构使得解析Class文件成为可能,JVM可以快速地加载和执行字节码。 总结来说,Java Class文件的格式设计是精心策划的,它不仅包含了类和接口的定义,还包含了它们的属性、方法、字段以及各种元数据。...
本文将围绕".class文件反编译工具"这一主题,详细讲解如何将`.class`文件转换为可读的`.java`源文件,并重点介绍解压后的jd-gui-windows-1.4.0工具的使用方法。 首先,了解`.class`文件结构至关重要。每个`.class`...
本项目“基于Go的Java Class文件解析工具”旨在利用Go语言开发一个工具,用于解析和理解这些二进制文件,帮助开发者更好地分析和理解Java程序的底层结构。 Go语言是一种静态类型的、编译型的、垃圾回收的语言,具有...
这类工具通常能解析Class文件的结构,解析出类名、方法、变量等信息,并生成类似于原始源代码的文本表示。 描述中提到,这个特定的反编译工具只能处理单个Class文件,而不能对整个Java项目进行批量反编译。这意味着...
标题提到的"反编译软件"是一种工具,它允许用户查看和理解Java类文件的内部结构,即使原始的源代码不再可用。这种软件对于调试、逆向工程、学习或者分析第三方库的实现非常有用。 描述中指出,这款软件无需安装,...
“class文件反编译工具”是一种实用的开发辅助工具,它允许开发者查看和理解已编译的Java程序内部结构,这对于学习开源库、调试、逆向工程或者分析恶意软件的行为非常有帮助。其中,`jd-gui`是一个常见的开源Java反...
本文将深入探讨“class文件”的解析过程,这是理解Java虚拟机工作原理的关键一步。通过分析《深入理解Java虚拟机》一书中的案例,我们可以更深入地了解这个过程。 首先,class文件是Java编译器将源代码编译后的二...
然而,.class文件本身并不包含原始的Java源代码,因此,如果失去了源代码,或者需要查看非开源库的内部实现,就需要用到反编译工具。DJJava就是这样一款工具,它可以解析Java字节码并生成接近原始的Java源代码。虽然...
Java反编译是一种技术,它允许开发者从已编译的.class文件中恢复原始的.java源代码。这在一些情况下非常有用,例如分析第三方库的内部实现、研究代码逻辑或者在丢失源代码时恢复源码。Java编译器将源代码转换成字节...
装载阶段负责找到并导入Class文件,链接阶段包括检查(验证Class文件的正确性)、准备(为类的静态变量分配内存)和解析(转换符号引用为直接引用),最后初始化阶段执行静态变量和静态代码块的初始化工作。...