`

java class文件解析

阅读更多

class文件就是java源文件编译的生成的文件。废话不多说,我们通过一个实例来解析.class文件的构成吧。

 

写一个测试类,代码如下:public final class TestClass { 

public int id =123 ; 
private String name="中国人";
public void test() {
	int a=1;
	int b=2;
	int c=a+b;
	String str=name+"最伟大";
	System.out.println(str);
} 
}

 

 Javac 后生成的class文件如下:

 

对应的解析结果如下:

magic number = 0xCAFEBABE -----标准class文件

Version = 50.0

constant pool size = 49

#1  10 Methodref  classIndex@13, nameAndType @25

#2  9 Fieldref  classIndex@12,nameAndTypeIndex@ 26

#3  8 StringIndex  @27

#4  9 Fieldref  classIndex@12,nameAndTypeIndex@ 28

#5  7 classIndex  @29

#6  10 Methodref  classIndex@5, nameAndType @25

#7  10 Methodref  classIndex@5, nameAndType @30

#8  8 StringIndex  @31

#9  10 Methodref  classIndex@5, nameAndType @32

#10  9 Fieldref  classIndex@33,nameAndTypeIndex@ 34

#11  10 Methodref  classIndex@35, nameAndType @36

#12  7 classIndex  @37

#13  7 classIndex  @38

#14  1 Utf8 id

#15  1 Utf8 I

#16  1 Utf8 name

#17  1 Utf8 Ljava/lang/String;

#18  1 Utf8 <init>

#19  1 Utf8 ()V

#20  1 Utf8 Code

#21  1 Utf8 LineNumberTable

#22  1 Utf8 test

#23  1 Utf8 SourceFile

#24  1 Utf8 TestClass.java

#25  12 NameAndType  name@18,  descripter@19

#26  12 NameAndType  name@14,  descripter@15

#27  1 Utf8 浗浜?

#28  12 NameAndType  name@16,  descripter@17

#29  1 Utf8 java/lang/StringBuilder

#30  12 NameAndType  name@39,  descripter@40

#31  1 Utf8 ?紵澶?

#32  12 NameAndType  name@41,  descripter@42

#33  7 classIndex  @43

#34  12 NameAndType  name@44,  descripter@45

#35  7 classIndex  @46

#36  12 NameAndType  name@47,  descripter@48

#37  1 Utf8 TestClass

#38  1 Utf8 java/lang/Object

#39  1 Utf8 append

#40  1 Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;

#41  1 Utf8 toString

#42  1 Utf8 ()Ljava/lang/String;

#43  1 Utf8 java/lang/System

#44  1 Utf8 out

#45  1 Utf8 Ljava/io/PrintStream;

#46  1 Utf8 java/io/PrintStream

#47  1 Utf8 println

#48  1 Utf8 (Ljava/lang/String;)V

access_flags = 49 [public final ]

This class = 12

Super class = 13

 

 

 

下面我详细讲解一下上面的结果和十六进制的图的对应关系

上面的图有红线和蓝线。意思是一样的,交替使用是为了在换行识别的连续性。

<!--EndFragment-->

 

 

下面我详细讲解一下上面的结果和十六进制的图的对应关系

上面的图有红线和蓝线。意思是一样的,交替使用是为了在换行识别的连续性。

 

Class File format

type

descriptor

remark

u4

magic

0xCAFEBABE

u2

minor_version

 

u2

major_version

 

u2

constant_pool_count

 

cp_info

constant_pool[cosntant_pool_count – 1]

index 0 is invalid

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]

 


 

 

第一排:[CA FE BA BE 表示魔数: 0xCAFEBABE],[00 00表示次版本号:0],[00 32表示主版本号:50 ] [00 31 表示常量池个数:49],后面就是常量池里面具体的值了.示例性的讲2个吧。[0A tag表示常量类型为10(Methodref),tag枚举见附,00 0D表示class_index,他在常量池的第13个,也就是java/lang/Object]

在第1f0h行常量池结束。常量池后面是

[00 31,表示access_flags:49,意思是该类是public,final],

[00 0C表示this_class,常量池第12个即TestClass],

[00 0D表示super_class,常量池第13个, 表示java/lang/Object],

[00 00表示接口个数为0],

[00 02表示fields_count为2,有两个字段。后面就是对两个字段进行描述]

[00 01 00 0E 00 0F 00 00 分别表示: 00 01字段为public,00 0E表示字段名在常量池第14个,即id,00 0F表示字段描述符I,即int型, 00 00表示属性的个数,他没有所以为0]

[00 02 00 10 00 11 00 00 分别表示:00 02字段修辞符为private,00 10表示字段名在常量池第16个,查为:name,00 11表示字段类型在常量池第17个即:Ljava/lang/String;,00 00表示属性个数为0]

[00 02表示方法个数为2,后面就是详情的方法]

直到240h红线处是该类的构造方法。红线开始是test()方法

直到2a0h红线处方法结束

后面是性属。最后一排01和上排末00表示属性长度为1,后面00 17表示23表示属性的字符串常量在常量池的位置,即SourceFile。表示该属性为源文件。长度为00 02,根据JVM规范,这个值永远为2.具体原因不清楚。最后的00 18表示文件名在常量池的位置为24,即TestClass.java

好了,解析完了。这是通过实战让大家了解class文件的结构。理论参考:http://408036296.blog.163.com/blog/static/1688515020118685836314/?latestBlog

 

 

附上tag数据类型:

 

tag中表示的数据类型:

CONSTANT_Class_info                                  (7)、

CONSTANT_Integer_info                              (3)、

CONSTANT_Long_info                                   (5)、

CONSTANT_Float_info                                  (4)、

CONSTANT_Double_info                              (6)、

CONSTANT_String_info                                 (8)、

CONSTANT_Fieldref_info                              (9)、

CONSTANT_Methodref_info                       (10)、

CONSTANT_InterfaceMethodref_info      (11)、

CONSTANT_NameAndType_info                (12)、

CONSTANT_Utf8_info                                   (1)、


 

 

 

  • 大小: 251.9 KB
分享到:
评论

相关推荐

    基于Go的Java Class文件解析工具.zip

    本项目“基于Go的Java Class文件解析工具”旨在利用Go语言开发一个工具,用于解析和理解这些二进制文件,帮助开发者更好地分析和理解Java程序的底层结构。 Go语言是一种静态类型的、编译型的、垃圾回收的语言,具有...

    java解析class文件

    Java解析Class文件是Java开发中的一个重要环节,它涉及到对字节码的理解和处理。Class文件是Java编译器将源代码编译后的结果,包含了类的结构信息、方法定义、常量池等关键数据。理解并能解析Class文件,对于进行JVM...

    java class文件编译

    Java Class文件是Java程序经过编译后的二进制表示形式,它是Java虚拟机(JVM)执行的基础。本文将深入探讨Java类文件的结构、编译过程以及如何使用提供的工具进行查看。 一、Java类文件结构 Java源代码(.java文件...

    java反编译工具,直接查看class文件

    class文件变java源代码,可同时打开多个文件,关键字高亮显示

    python实现的简单的class解析以及简单执行class.zip

    在本主题中,我们将探讨如何使用Python来解析Java的Class文件,并对其进行简单的执行。这是一项有趣的技术,可以帮助我们理解Java字节码的工作原理,同时也可以在Python环境中运行Java代码。 首先,Java的Class文件...

    Java Class文件反编译工具 jd-gui

    Java Class文件是Java程序编译后的二进制格式,它包含了类和接口的定义、方法体、常量池等信息,但这些信息是以机器可读的字节码形式存在,对于人类来说不易理解。为了查看和理解Class文件内部的源代码,我们就需要...

    class文件解析器

    class文件解析器class文件解析器class文件解析器

    java class文件查看工具

    "java class文件查看工具"就是用于这样目的的专业软件,它提供了查看和解析Class文件内容的功能。 1. **Class文件结构** Java Class文件遵循特定的文件格式,这个格式由一系列的8位字节构成,包括魔数(Magic ...

    java对mht文件解析

    ### Java对MHT文件解析及内容抓取技术详解 #### 一、引言 MHT(Mime HTML)文件是一种将HTML文档与嵌入资源(如图像、样式表等)合并为一个文件的格式,方便在网络上传输。本文将详细介绍如何使用Java语言解析MHT...

    java class文件查看器

    Java Class文件查看器是一款专为Java开发者设计的实用工具,它允许用户查看和分析.class文件,这是Java编译器将源代码编译后的二进制形式。了解如何使用这类工具对于理解和调试Java应用程序至关重要,尤其是在处理已...

    Java文件结构解析工具

    一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...

    yaml文件解析(java)

    本文将深入探讨如何在Java中解析YAML文件,包括依赖管理、封装解析类以及源码分析。 首先,为了在Java项目中使用YAML解析功能,我们需要引入相关的库。在Maven项目中,可以在`pom.xml`文件中添加SnakeYAML的依赖: ...

    class文件解析案例

    通过以上分析,我们可以看到,class文件解析是理解Java运行机制的关键一环,而《深入理解Java虚拟机》一书为我们提供了宝贵的理论基础和实践指导。结合样例数据,读者可以进一步探索和掌握Java虚拟机的内部运作。

    java class文件或jar文件反编译工具.rar

    Java class文件和jar文件是Java程序的二进制表示形式,它们包含了编译后的字节码,用于JVM(Java虚拟机)执行。在开发和调试过程中,有时我们需要查看源代码,但原始的.java源文件可能丢失或者不可用。这时,反编译...

    JavaClass文件的结构分析及其校验.pdf

    ### JavaClass文件的结构分析及其校验 #### 引言 随着Java技术的不断发展与广泛应用,JavaClass文件作为Java程序的基础组成部分,其结构与验证机制的重要性日益凸显。本文旨在深入探讨JavaClass文件的结构特点,并...

    Android-Java代码解析class文件

    总结来说,理解并解析Java的class文件对于Android开发者来说非常重要,这不仅能帮助我们优化代码、排查问题,还能增强对代码底层运行机制的理解,从而编写出更高效、更安全的应用。通过学习和使用相关工具,开发者...

    java 解析 json文件 java 解析 json文件

    Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...

    JavaDecompiler打开class文件

    `JavaDecompiler`这个标题暗示我们将探讨如何使用Java反编译器来打开和解析.class文件。 Java类文件是Java虚拟机(JVM)执行的二进制格式,包含了程序的指令、常量池、字段和方法定义等信息。然而,这些信息对于...

    java解析dbf文件方案.pdf

    Java 解析 DBF 文件方案 Java 解析 DBF 文件方案是使用 Java 语言来读取和解析 DBF 文件的方法。DBF 文件是一种常见的数据库文件格式,广泛应用于许多行业。为了读取和解析 DBF 文件,需要使用 Java 语言中的数据库...

Global site tag (gtag.js) - Google Analytics