在Java编程中,类加载器(ClassLoader)是一个非常重要的机制,它负责将java类文件加载到Java虚拟机(JVM)内存中,以便程序可以使用这些类。类加载器的工作可以分为几个步骤:
-
加载(Loading): 这是类加载器的第一步,它会找到包含类的字节码文件(通常是
.class
文件),并将它们读入内存。 -
链接(Linking): 这一步又分为三个小步骤:
-
初始化(Initialization): 执行类的初始化代码,包括静态代码块和静态变量的赋值。
类加载器的类型
Java中有几种常见的类加载器,每种类加载器有不同的职责:
-
启动类加载器(Bootstrap ClassLoader): 这是最基础的类加载器,由JVM自身实现,负责加载核心Java类库(如
java.lang.*
等)。 -
扩展类加载器(Extension ClassLoader): 负责加载扩展的Java类库(位于
JRE/lib/ext
目录下)。 -
应用程序类加载器(Application ClassLoader): 负责加载用户类路径(classpath)下的类,大部分我们自己写的Java代码都是由它加载的。
类加载器的双亲委派模型
类加载器有一个非常重要的机制叫做“双亲委派模型”(Parent Delegation Model)。简单来说,当一个类加载器需要加载一个类时,它会先把这个任务交给它的父类加载器去做。如果父类加载器找不到这个类,才会由当前类加载器自己去加载。
这个机制的好处是,可以避免重复加载类,并确保核心类库的安全性和统一性。
举个例子
假设你写了一个Java程序,其中有一个类叫MyClass
。当程序运行到需要使用MyClass
的时候,Java虚拟机会这样做:
- 应用程序类加载器首先收到加载
MyClass
的请求。 - 应用程序类加载器会先把这个请求交给它的父类加载器(扩展类加载器)。
- 扩展类加载器再把请求交给它的父类加载器(启动类加载器)。
- 启动类加载器会检查它的类库中是否有
MyClass
,如果没有,它会告诉扩展类加载器“我没有找到”。 - 扩展类加载器再告诉应用程序类加载器“我没有找到”。
- 最后,应用程序类加载器会自己去找并加载
MyClass
。