类装载器工作机制
类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件。在Java 中,
类装载器把一个类装入JVM 中,要经过以下步骤:
1.装载:查找和导入Class 文件;
通过一个类的全限定名来获取定义此类的二进制字节流.然后将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.最后在Java堆中生成一个代表这个类的java.lang.class对像,作为方法区的数据入口.
2.链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
a)校验:检查载入Class 文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用转成直接引用;
3.初始化:对类的静态变量、静态代码块执行初始化工作。
类装载工作由ClassLoader 及其子类负责,ClassLoader 是一个重要的Java 运行时系统组件,它负责在运行时查找和装入Class 字节码文件。JVM 在运行时会产生三个
ClassLoader:
BootstrapClassLoader
Extension ClassLoader(扩展类装载器)
Application ClassLoader(系统类装载器)。
其中,BootstrapClassLoader不是ClassLoader 的子类,它使用C++编写,因此我们在Java 中看不到它,BootstrapClassLoader负责装载JRE 的核心类库,如JRE 目标下的rt.jar、charsets.jar 等。
Extension ClassLoader 和Application ClassLoader 都是ClassLoader 的子类。其中Extension ClassLoader 负责装载 JRE 扩展目录ext 中的JAR 类包;Application 负责装载Classpath 路径下的类包。
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current loader:"+loader);
System.out.println("parent loader:"+loader.getParent());
System.out.println("grandparent loader:"+loader.getParent(). getParent());
}
}
current loader:sun.misc.Launcher$AppClassLoader@131f71a
parent loader:sun.misc.Launcher$ExtClassLoader@15601ea
//①根装载器在Java中访问不到,所以返回null
grandparent loader:null
通过以上的输出信息,我们知道当前的ClassLoader 是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader 是根类装载器,因为在Java 中无法获得它的句柄,所以仅返回null。
JVM 装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader 装载一个类的时,除非显式地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader 载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础(如java.lang.String)并装载到JVM 中将会引起多么可怕的后果。但是由于有了“全盘负责委托机制”,java.lang.String 永远是由根装载器来装载的,这样就避免了上述事件的发生。
分享到:
相关推荐
类装载器ClassLoader1
这个模型可以用层次结构来表示,例如,系统类装载器(AppClassLoader)的父类是扩展类装载器(ExtClassLoader),扩展类装载器的父类是启动类装载器(Bootstrap ClassLoader)。在示例代码`LoaderSample1`中,我们...
3. **App ClassLoader**(应用程序类装载器):这是默认的类装载器,负责加载应用程序类路径(ClassPath)所指定的类。 此外,还可以自定义类装载器以满足特定需求,比如热部署(Hot Deployment)、模块化加载等。 ...
在Java中,ClassLoader是一个抽象类,位于`java.lang`包中,它是所有类装载器的基类。理解ClassLoader的关键在于掌握几个核心方法: 1. `loadClass(String name, boolean resolve)`:这是类装载的入口点。`name`...
在Java虚拟机(JVM)中,类装载器(ClassLoader)是至关重要的组成部分,它负责查找和加载Java类到JVM内存中。本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几...
Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、扩展类装载器(Extension ClassLoader)和应用程序类装载器(Application ClassLoader)。它们共同协作,根据类的全限定名(包括包名和...
下面是扩展装载器(Extension ClassLoader),它从扩展目录加载代码,然后是系统装载器(System ClassLoader),从classpath加载用户类。 类装载器遵循以下规则: 1. 一致性规则:每个类加载器维护一个名字空间,...
除此之外,还有扩展类装载器(Extension ClassLoader)和应用类装载器(Application ClassLoader),分别用于加载扩展目录下的类库和应用程序本身的类。 #### 动态装载的应用场景 动态类装载在多种情况下非常有用...
在实际开发中,类装载器的层次结构是关键,包括引导类装载器(Bootstrap ClassLoader)、扩展类装载器(Extension ClassLoader)和应用程序类装载器(Application ClassLoader),它们共同构成了双亲委派模型,保证...
1. **定义类装载器**:继承`java.lang.ClassLoader`类,并重写`findClass`方法。 2. **加载解密后的类**: - 使用`FileInputStream`读取解密后的`.class`文件。 - 将读取到的字节流转换为字节数组。 - 调用`...
这一过程涉及到了四个主要角色:类装载器(ClassLoader)、类的二进制表示、验证(Verification)、准备(Preparation)以及初始化(Initialization)。下面我们将逐一解析这些环节。 1. **类装载器**: 类装载器...
装载阶段涉及寻找并导入类或接口的二进制数据,通常由类装载器(ClassLoader)执行。链接阶段则包括校验、准备和解析,校验确保二进制数据的正确性,准备阶段为类的静态变量分配内存并初始化,解析则将符号引用转化...
接下来是类装载器ClassLoader,它负责加载类到JVM中。Spring通过自定义ClassLoader实现对Bean的动态加载和替换,面试中可能会考察你对不同类型的ClassLoader的理解以及它们在Spring中的作用。 Spring AOP原理涉及到...
3. **类装载器ClassLoader**:将编译后的.class文件加载到JVM中。 4. **字节码校验**:JVM中的字节码校验器检查加载的字节码是否符合规范,以确保程序的安全性。 5. **解释执行**:JVM的解释器负责将字节码转换为...
在Java中,类装载器 把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化。其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。各个步骤的主要工作如下: * ...
ClassLoader是一个抽象类,它有多个子类,如BootstrapClassLoader(引导类加载器)、ExtensionClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。每个类加载器都有自己的职责范围,如...
- `ExtClassLoader's father classLoader is: null`:扩展装载器的父加载器为启动类加载器`BootstrapClassLoader`,由于后者不是标准的Java类,因此显示为`null`。 #### 三、ClassLoader装载策略 从Java 1.2版本...
在该模型下,当一个ClassLoader收到加载类的请求时,它首先会委托父加载器去尝试加载,只有当父加载器无法加载时,当前加载器才会尝试自己加载。这样设计避免了类的重复加载,并确保了核心类库的唯一性。 四、...