Tuesday, November 3, 2015

Java class 文件格式以及类加载器介绍


Java class 文件格式以及类加载器介绍
在后面的内容中,需要对 Java class 文件格式以及类加载器的知识有一定的了解,所以这里先对这些内容做一个简单介绍:
class 文件格式
Java class 文件的结构如图 2 所示(图中“*”表示出现 0 次或任意多次):
图 2.Java class 文件结构



详细说明如下:
Magic Number: 每个 class 文件的前 4 个字节被称为“魔数”,它的内容为:0xCAFEBABE。魔数的作用在于可以轻松地分辨出一个文件是不是 class 文件。

Version: 该项指明该 class 文件的版本号。

Constant Pool: 常量池是 class 文件中结构最为复杂,也最为重要的部分。常量池包含了与文件中类和接口相关的常量。常量池中存储了诸如文字字符串,final 变量值。Java 虚拟机把常量池组织为入口列表的形式。常量池中许多入口都指向其他的常量入口,而且 class 文件中紧随着常量池的许多条目也都会指向常量池的入口。除了字面常量之外,常量池还可以容纳以下几种符号引用:类和接口的全限定名,字段的名称和描述符和方法的名称和描述符等。

Modifiers: 该项指明该文件中定义的是类还是接口,以及声明中用了哪种修饰符,类或接口是私有的,还是公共的,类的类型是否是 final 的,等等。

This class: 该项是对常量池的索引。在这个位置,Java 虚拟机能够找到一个容纳了类或接口全限定名的入口。这里需要注意的是:在 class 文件中,所有类的全限定名都是以内部名称形式表示的。内部名称是将原先类全限定名中的“.”替换为“/”。例如:java.lang.String 的内部名称为 java/lang/String。

Super Class: 该项也是对常量池的索引,指明了该类超类的内部名称。

Interfaces: 该项指明了由该类直接实现或由接口扩展的父接口的信息。
注:Modifiers,This Class,Super Class 和 Interfaces 这四项的和就是一个类的声明部分。
Annotation: 该项存储的是注解相关的内容,注解可能是关于类的,方法的以及字段的。
Attribute: 该项用来存储关于类,字段以及方法的附加信息。在 Java 5 引入了注解之后,该部分内容几乎已经没有用处。

Field: 该项用来存储类的字段信息。

Method: 该项用来存储类的方法信息。

===================================================================

类装载器介绍

类装载器负责查找并装载类。每个类在被使用之前,都必须先通过类装载器装载到 Java 虚拟机当中。Java 虚拟机有两种类装载器 :
启动类装载器
启动类装载器是 Java 虚拟机实现的一部分,每个 Java 虚拟机都必须有一个启动类装载器,它知道怎么装载受信任的类,比如 Java API 的 class 文件。
用户自定义装载器
用户自定义装载器是普通的 Java 对象,它的类必须派生自 java.lang.ClassLoader 类。ClassLoader 类中定义的方法为程序提供了访问类装载机制的接口。


类装载器工作机制 

类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 

[1.]装载:查找和导入Class文件; 
[2.]链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的: 
    [2.1]校验:检查载入Class文件数据的正确性; 
    [2.2]准备:给类的静态变量分配存储空间; 
    [2.3]解析:将符号引用转成直接引用; 
[3.]初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader:
根装载器、
ExtClassLoader(扩展类装载器)
AppClassLoader(系统类装载器)
1  根装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。
2  ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;
3  AppClassLoader负责装载Classpath路径下的类包。


这篇博客 还不错:


===================================================================
附录:






No comments:

Post a Comment