`
boy00fly
  • 浏览: 197736 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java class文件简介

    博客分类:
  • JVM
阅读更多

之前对Java虚拟机作了概述,接下来来讲一讲Java class文件,主要涉及class文件的内容,包括常量池的结构及其格式等。

 

Java class文件是什么?

 

java class 文件是对Java程序二进制文件格式的精确定义。每一个Java class文件都对一个Java类或者Java接口做出了全面描述。一个class文件中只能包含一个类或者接口。无论Java class文件在何种系统上产生,无论虚拟机在何种操作系统上运行,对Java class文件的精确定义使得所有Java虚拟机都能够正确地读取和解释所有Java class文件。

尽管class文件与java语言结构相关,但它并不一定必须与Java程序相关。

如上图所示:可以使用其他语言来编写程序,然后将其编译为class文件,或者把Java程序编译为另一种不同的二进制文件格式。实际上,Java class文件的形式能够表示Java源代码中无法表达的有效程序,然而,绝大多数Java开发者几乎都会选择使用class文件作为传递给虚拟机的首要方式。Java class文件是八位字节的二进制流。数据项按顺序存储在class文件中,相邻的项之间没有任何间隔,这样可以使得class文件紧凑。占据多个字节空间的想按照高位在前的顺序分为几个连续的字节存放。

和java的类可以包含多个不同的字段、方法、方法参数、局部变量等一样,Java class文件也能够包含许多不同大小的项。在class文件中,可变长度项的大小和长度位于其实际数据执之前。这个特性使得class文件流可以从头到尾被顺序解析,首先读出项的大小,然后读出项的数据。

 

 

Class文件的内容是什么?

 

Java class文件中包含了Java虚拟机所需知道的,关于类或接口的所有信息。

 

A class file consists of a single ClassFile structure:

 

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];

}

 

备注:u1 a single unsigned byte 

 u2 two unsigned bytes 

 u4 four unsigned bytes 

 u8 eight unsigned bytes 

 

  • Magic Number: 0xCAFEBABE
  • Version of Class File Format: the minor and major versions of the class file
  • Constant Pool: Pool of constants for the class
  • Access Flags: for example whether the class is abstract, static, etc
  • This Class: The name of the current class
  • Super Class: The name of the super class
  • Interfaces: Any interfaces in the class
  • Fields: Any fields in the class
  • Methods: Any methods in the class
  • Attributes: Any attributes of the class (for example the name of the sourcefile, etc)

ClassFile表中各项简介如下:

(1) magic(魔数)

每个Java class文件的钱四个字节被称为他的魔数(magic number):0xCAFEBABE。魔数的做作用在于。可以轻松的分辨出Java class文件和非Java class文件,如果一个文件不是以0xCAFEBABE开头,那它肯定不是java class文件。文件格式定义者能够自由选择魔数,前途是这个选中的魔数值没有被广泛应用。当java还被称为“Oak”的时候,这个魔数就已经确定下来了。依照Patrick Naughton(最初Java开发小组的关键成员)的说法:“早在Java第一次作为该语言的名字发布前,我们就寻找一些好玩的、唯一的、容易记忆的东西。选择0xCAFEBABE只不过是一个巧合,他象征着著名的咖啡品牌Peet's Coffee中最受欢迎的baristsa(一种咖啡的名称),他预示着Java这个名字的出现”

 

(2) minor_version和major_version

class文件的下面4个字节包含了主、次版本号。随着Java技术的发展,Java class文件格式可能会加入新特性。class文件格式一旦发生变化,版本号也会随之变化。对于Java虚拟机来说,版本号确定了特定的class文件格式,通常只有给定主版本号和一系列次版本号后,Java虚拟机才能够读取class文件。如果class文件的版本号超出了Java虚拟机所能处理的有效范围,Java虚拟机将不会处理该class文件。

在Sun的JDK1.0.2发布版中,Java虚拟经济实现支持从45.0(主版本号为45,次版本号为0)到45.3的class文件格式。在所有JDK1.1发布版本中虚拟机都能够支持版本从450.到45.65535的class文件格式。在Sun的1.2版本的SDK中,虚拟机能够支持从版本45.0到46.0的class文件格式。

。。。。。

 

(3)constant_pool_count和constant_pool

在class文件中,魔数和版本号后面的是常量池。在前面JVM的介绍中提到的http://boy00fly.iteye.com/blog/1095263,常量池中包含了与文件中类和接口相关的常量。常量池中存储了诸如文字字符串、final变量值、类名和方法名的常量。Java虚拟机把常量池组织为入口列表的形式。在实际列表constant_pool之前,是入口在列表中的计数constant_pool_count.

常量池中的许多入口都指向其他的常量池入口,而class文件中紧随这常量池的许多条目也会指向常量池中的入口。在整个class文件中,指示常量池入口在常量池列表中位置的整数索引都指向这些这些常量池入口。列表中的第一项索引值为1,第二项索引值为2,一次类推。尽管constant_pool列表中没有索引值为0的入口,但缺失的这一入口也被constant_pool_count计数在内。例如:当constant_pool中有14项(索引值从1到14)时,constant_pool_count的值为15。

每个常量池入口都从一个长度为一个字节的标志开始,这个标志指出了列表中该位置的常量类型。一旦java虚拟机获取并解析这个标志,Java虚拟机就会知道标志后的常量类型时什么。

 

 

Entry Type Tag Value Description

CONSTANT_Utf8 1 A UTF-8 encoded Unicode string 

CONSTANT_Integer         3 An int literal value 

CONSTANT_Float 4 A float literal value 

CONSTANT_Long 5 A long literal value 

CONSTANT_Double 6 A double literal value 

CONSTANT_Class 7 A symbolic reference to a class or interface 

CONSTANT_String 8 A String literal value 

CONSTANT_Fieldref                 9         A symbolic reference to a field 

CONSTANT_Methodref        10 A symbolic reference to a method declared in a class 

CONSTANT_InterfaceMethodref        11       A symbolic reference to a method declared in an interface 

CONSTANT_NameAndType        12 Part of a symbolic reference to a field or method 

 

 

上面的每一个标志都有一个相对应的表,表明通过在标志名后加上"_info"后最来产生。例如:对应于CONSTANT_Class标志的表名为CONSTANT_Class_info,表名为CONSTANT_Utf8_info的表中存储着Unicode字符串的压缩形式。对应于各种不同的常量池入口的表,在后续章节中再阐述。

在动态连接的Java程序中,常量池充当了十分重要的角色。除了字面常量(或者说直接量)以外,常量池还可以容纳下面几种符号引用;

  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法的名称和描述符

字段是类或接口的实例变量或者类变量。字段的描述符是一个指示字段的类型的字符串。

方法的描述符也是一个字符串,该字符串指示方法的返回值和参数的数量、顺序和类型。

在运行时,Java虚拟机使用常量池的全限定名、方法和字段的描述符,把当前类或接口中的代码与其他类或接口中的代码连接起来。

由于class文件并不包含其内部组件最终内存布局的信息,因此类、字段和方法并不能被class文件中的字节码直接引用。

java虚拟机从常量池获得符号引用,然后再运行时解析引用项的实际地址。例如,用来调用方法的字节码指令把一个符号引用的常量池所有传给所调用的方法。

 

(4) access_flags

紧接常量池后的两个字节称为access_flags,他展示了文件中定义的类或接口的几段信息。例如,访问标志指明文件中丁定义的是类还是接口;访问表示还定义了在类或接口的声明中使用了哪种修饰符;类和接口是抽象的,还是公共的;类的类型可以为final,而final类不可能是抽象的;接口不能为final类型。

(5) this_class

接下来的两个字节为this_class项,他是一个对常量池的索引。在this_class位置的常量池入口必须为CONSTANT_Class_info表。.....

 

(6) super_class

在class文件中,紧接在this_class之后的是super_class项,他是一个两个字节的常量池索引。在super_class位置的常量池入口是一个指向该类超类全限定名CONSTANT_Class_info.

 

(7) interface_count和interface

紧接着super_class的是interface_count。此项的含义为:在文件中由该类直接实现或者由接口扩展的父接口的数量。在这个计数的后面,是名为interface的数组,他包含了对每个由该类或者接口直接实现的父接口的常量池索引。

 

(8) fields_count和fields

紧接在interfaces后面的是对在该类或接口中所声明的字段的描述。首先是名为fields_count的计数,他是类变量和实例变量的字段的数量总和。

在这个技术后面的是不同长度的field_info表的序列。

field的结构具有以下格式:

 

field_info {

u2 access_flags;

u2 name_index;

u2 descriptor_index;

u2 attributes_count;

attribute_info attributes[attributes_count];

}

 

 

(9) methods_count和methods

紧接在fields后面的是对在该类或接口中所声明的方法的描述。

method的结构具有以下格式:

 

method_info {

u2 access_flags;

u2 name_index;

u2 descriptor_index;

u2 attributes_count;

attribute_info attributes[attributes_count];

}

 

 

(10) attributes_count和attributes

class文件中最后的部分是属性(attribute),他给出了在该文件中类或接口锁定义的属性的基本信息。

attribute的结构具有以下格式:

 

attribute_info {

u2 attribute_name_index;

u4 attribute_length;

u1 info[attribute_length];

}

 

  • 大小: 48 KB
  • 大小: 58.8 KB
  • 大小: 39.3 KB
分享到:
评论

相关推荐

    java class文件编译

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

    java class文件反编译

    1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...

    Class文件转JAVA

    轻松方便的把class文件转化为java文件

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

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

    java class文件查看工具

    Java Class文件是Java源代码经过编译器处理后的二进制形式,它们包含了程序的结构信息,如类、接口、变量、方法等定义。在Java开发过程中,有时我们需要查看或分析这些Class文件,以理解程序运行原理、调试或逆向...

    java class文件查看器

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

    java class文件反编译器

    java class文件反编译器,可以看轻松查看源代码!下吧

    Java反编译工具把.class文件转换为.java文件

    ### Java反编译工具:将.class文件转换为.java文件 #### 概述 在软件开发领域,有时我们可能需要分析第三方库或者开源项目的内部结构,这时就需要借助于反编译工具来帮助我们阅读和理解其源码。Java作为一种广泛...

    电脑java class文件查看与修改工具

    本篇文章将详细讲解如何使用指定的"电脑java class文件查看与修改工具"来查看和修改这些文件。 首先,我们要了解的是`jd-gui查看.exe`。这是一个名为JD-GUI的开源工具,它允许开发者直观地查看Java字节码(.class...

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

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

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

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...

    Java class 文件反编译工具

    Java class 文件反编译工具Java class 文件反编译工具

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

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

    JavaDecompiler打开class文件

    它允许用户查看并理解已编译的.class文件的内容,因为Java的源代码(.java文件)通常不会随可执行文件一起发布。`JavaDecompiler`这个标题暗示我们将探讨如何使用Java反编译器来打开和解析.class文件。 Java类文件是...

    java class文件编辑器

    Java Class文件编辑器,如JD-GUI 0.3.3 绿色版,是一种用于查看和理解Java字节码的工具,对于开发者而言尤其重要,因为它提供了将已编译的`.class`文件反编译回源代码的能力。在深入讨论这个工具之前,我们先来了解...

    Java class文件反编译工具集

    Java class文件是Java程序编译后的二进制代码,它包含了类、方法、变量等信息。但是,由于class文件是以机器可读的形式存在,对于人类来说并不直观。这时,我们就需要借助于反编译工具来将class文件转换回源代码...

    查看java class文件工具

    非常方便查看java class文件 无需安装

    java class文件反编译工具

    Java Class文件反编译工具是开发者在处理已编译的.class文件时的一种实用工具,它能够将二进制的Class文件转换回可读性更强的源代码格式,这对于理解和调试已封装的库或分析未知的Java程序至关重要。本文将详细介绍...

    ClassFinal是一款java class文件安全加密工具

    总的来说,ClassFinal作为一款Java class文件安全加密工具,为开发者提供了一种简单、高效的代码保护方案,尤其适合于那些重视代码安全但又不想改动大量代码的企业级项目。其兼容性和易用性使其在Java开发领域具有...

Global site tag (gtag.js) - Google Analytics