`
bolinyang
  • 浏览: 76029 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java的class文件结构介绍以及如何实现javap

    博客分类:
  • JVM
JVM 
阅读更多
一.概述

      我们在写JAVA程序的时候,面对的都是.java文件的编写,但是JVM不会直接拿.java文件去执行的,对于JVM而言,它只认识.class文件,那么是不是后缀名是.class的文件JVM都会接收呢?显然不是,因为要想JVM接受一个.class文件,这个.class文件必须要有严格的结构,这样JVM才会识别这个.class文件,并且按照.class文件去做一些事情。
      我们写的.java文件首先要经过JAVA编译器的编译,这时候编译的结果就是.class文件,JAVA语言有它自己的语法产生式,编译的时候,首先对源程序进行此法分析,然后再在词法分析的基础上按照JAVA语言自己的语法产生式进行语法分析,语法分析的目的是按照产生式对源程序(这里源程序其实就是一个字符串)进行一系列推导,比如,最左推导,最右推导等等,如果无法按照产生式推导出这个字符串,这就说明源程序有语法错误。如果源程序没有语法错误,此时JAVA编译器就是生成目标代码,其实就是.class文件,这时候这个.class文件有非常严格的结构,能够被JVM所识别,其实.class文件就是javac的结果,同样也有一个javap命令可以实现反编译,javap可以把一个.class文件中各个结构清晰的打印出来,方便开发人员和.java文件进行对比。假如有一个Test.class文件,我们是由javap -verbose Test就可以看到这个class文件各个部分的具体结构了。这里的主要目的就是分析class文件的结构以及怎么去实现一个javap这样的命令。



上图是针对上面描述的一个图示概述

二.class文件的整体数据结构


      通过观察上图,我们发现java源程序中的所有信息都可以在class文件中体现出来(注释除外),每个class文件最后都有一些附加属性,这些附加属性是针对这个class的描述。比如当前class对应的源程序文件名称,当前class的内部class等等都属于class的附加属性,出现在class文件的最后。

下面我们给出class文件的数据结构表,可以参考http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html
类型名称数量
u4magic(魔数)1
u2minor_version(版本号之小版本号)1
u2major_version(版本号之主版本号)1
u2constant_pool_count(常量池中常量的数目)1
cp_infoconstant_pool(常量池)constant_pool_count - 1
u2access_flags(当前类的访问权限标记)1
u2this_class(当前类的相关描述信息)1
u2super_class(当前类超类的描述信息)1
u2interfaces_count(当前类实现的接口数目)1
u2interfaces(当前类实现了那些接口)interfaces_count
u2field_count(当前类的字段数目)1
field_infofields(当前类的字段)field_count
u2method_count(当前类的方法数目)1
method_infomethods(当前的方法)method_count
u2attributes_count(当前类的附加属性数目)1
attribute_infoattributes(当前类的附加属性)attributes_count

注:

1.上述数据结构中既有无符号数,也有表,所有的表都以_info结尾,表用于描述有层次关系的复合数据结构,无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置容量计数器加若干连续的数据项的形式,这时候称这一系列连写的某一类型的数据为某一类型的集合。


2.对于class文件的这么多结构,其实一开始没有必要担心的也没有必要仔细去深究这些结构的之间的关系,先有个大致的了解,慢慢往后一个一个数据结构去理解,最后再回过头来看看这些数据结构,你就能理解他们之间的关系,以及表的内部是如何组织的了。

三.魔数和版本号的解析

1.关于魔数的解析
     在.class文件的开头四个字节就是.class文件的魔数,这个魔数决定了这个.class文件能否被JVM虚拟机所加载。首先读取这个字节数组,这个字节数组大小是4,然后把这个字节数组转换成一个十六进制的数字,看看这个十六进制的数字是不是0XCAFFEEBABE,如果这个字节数组对应的十六进制数是0XCAFFEEBABE,这时候这个.class文件就可以被JVM所加载,否则这就是一个非法的.class文件。在这里需要注意的是一个字节表示8个二进制为,那么四个字节就是32个二进制位了。


2.关于版本号的解析
     紧接着魔数后面就是版本号,这个版本号其实和JDK的版本有关,分为次版本号和主版本号,各占一个字节,把这个字节转换成十进制数字,就可以看到版本号是多少了。


3.关于魔数和版本号的解析,说白了就是字节数组到十六进制或者十进制数值之间的转换。


4.下面用vi打开一个.class文件,然后使用%!xxd切换到十六进制显示,可以看看魔数和版本号


四.常量池的解析

1.关于常量池的概述
     常量池是一个很重要的部分,首先从字面意思来理解,常量即不变,池说明是一个容器,在这个容器中存放的都是一些不变的量,把这些不变的量集中在一个地方,方便其他模块引用,这也是写程序时的一个基本理念。在常量池中主要存放了两大类常量:字面量(Literal)和符号引用(Symbolic Reference)。字面量比较接近JAVA语言层面的常量,如文本字符串,被定义为final类型的常量值等等。而符号引用和编译原理有关,编译JAVA代码的时候需要一个符号表,这个符号表中存储了对于方法和字段以及类描述等信息。每个方法都有一些固定的属性,例如方法名称,返回值类型,入参类型等等,这些信息在编译的过程存储在符号表中,在CLASS文件中就体现在常量池中。


2.常量池中内容概述图



未完待续
  • 大小: 37.9 KB
  • 大小: 60.1 KB
  • 大小: 38.1 KB
分享到:
评论

相关推荐

    java解析class文件

    总而言之,Java解析Class文件涉及到Java虚拟机的内部运作机制,包括类的结构、方法、字段、异常处理以及模块系统等。掌握这些知识能够帮助开发者更高效地进行代码优化、逆向工程以及开发基于字节码的框架。通过学习...

    java class文件解析

    2. **类文件结构**:每个Class文件都遵循固定的结构,包括魔数、版本信息( minor version 和 major version)、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合以及属性表集合等。...

    class文件结构(简单class文件)

    class文件是Java编译后的字节码文件,是Java虚拟机(JVM)能够理解和执行的指令...理解class文件结构,可以帮助开发者更好地编写、调试和优化Java程序,同时,这也有助于理解JVM的工作原理和Java虚拟机如何处理字节码。

    class文件编译器.zip

    这个压缩包`class文件编译器.zip`很可能包含了关于如何将Java源代码编译成`.class`文件的相关工具和信息。`ReadMe.txt`可能是提供编译过程的说明或者编译器使用的指南。 1. **Java源代码与Class文件**: Java源...

    .class文件反编译成java文件工具

    `.class`文件反编译工具通常采用逆向工程的方法,解析.class文件的字节码结构,并尝试将其翻译成接近原始的Java源代码。这样的工具能够帮助开发者分析库、框架或者无法获得源代码的程序,从而增进理解和学习。尽管反...

    Java class文件格式1

    Java Class文件是Java程序编译后的二进制形式,它是Java虚拟机(JVM)运行的基础。Class文件的格式是严格定义的,确保了JVM...开发者可以通过反编译工具,如javap,来查看Class文件的详细内容,进一步了解其内部结构。

    从一个class文件深入理解Java字节码结构

    Java程序在执行时,首先需要通过Java编译器将源代码(.java文件)编译成二进制的字节码文件(.class文件),这些字节码由Java虚拟机(JVM)解析并执行。深入理解字节码结构有助于我们了解Java程序的运行机制,优化...

    class文件解析

    jad是一个早期的Java反汇编器,它可以解析Class文件并展示其中的字节码,但现代的开发环境中更常用的是javap,它是JDK自带的命令行工具,提供了丰富的选项来查看类的结构和字节码细节。 通过解码Class文件,开发者...

    java类文件结构(笔记).docx

    Java 类文件结构是Java虚拟机(JVM)执行的基础,它包含了构成Java程序的所有必要信息。Class文件是一种二进制...理解Class文件的结构对于深入学习Java虚拟机的工作原理、优化代码以及进行反编译分析等都有重要意义。

    class文件解析案例

    提供的jvm.docx文件可能包含更详细的案例分析,比如如何解析特定的class文件,如何理解字节码指令,以及这些指令如何与JVM的运行机制相结合。 5. **理解与实践**: 学习class文件解析不仅可以加深对Java虚拟机的...

    jvm解析编译过的class文件

    总之,理解JVM解析和执行.class文件的过程对于Java开发者来说至关重要,它能帮助我们优化代码、调试问题以及提升系统性能。通过学习相关工具和源码,我们可以更深入地掌握这个过程,从而成为更优秀的Java程序员。

    Java的 Class(类)文件结构详解

    在实践过程中,可以尝试反编译Class文件(如使用jd-gui工具),观察其中的字节码指令,或者使用javap命令查看编译后的字节码,以加深对Class文件结构的理解。通过这样的学习方式,你不仅能了解Java语言的内部运作...

    Java class文件格式之数据类型_动力节点Java学院整理

    当Java类被编译成class文件后,可以使用Java提供的工具,比如javap,来对class文件进行反编译,得到更易于人类阅读的代码表示。例如,对于上述提到的TestInt类,使用javap -v -c 命令可以查看到其反编译后的字节码...

    编译好的CLASS文件

    在Java编程语言中,"编译好的CLASS文件"是指经过Java编译器(javac)处理的源代码(.java文件)所生成的目标文件。这些文件以二进制格式存储,可以直接由Java虚拟机(JVM)执行。CLASS文件包含了Java类或接口的字节...

    怎么看jar包的class文件?

    - **unzip命令**:虽然不是专门针对JAR文件,但`unzip`命令可以解压JAR文件内容到本地文件系统,然后用文本编辑器或`javap`命令查看class文件。例如,`unzip jar_file_name.jar`。 2. **使用Java反编译器**: - *...

    class文件格式分析实验

    1. **Class文件结构** Java类文件是基于一种固定的二进制格式,它由一系列8位字节构成,不区分字节序。每个类文件都有以下基本结构: - **魔数**:占4个字节,用于标识这是一个Java类文件,固定值为0CAFEBABE。 -...

    JAVA-class编辑器

    2. class文件结构: .class文件遵循特定的二进制格式,包括魔数、版本号、常量池、类和父类信息、接口、字段、方法、属性等部分。了解这些结构对于解析和编辑class文件至关重要。 3. 类编辑器的功能: - 查看字节...

Global site tag (gtag.js) - Google Analytics