JVM在运行时产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中根装载器不是ClassLoader的子类,它使用C++编写,所以我们在Java中是看不到它的。
那么这三个ClassLoader是做什么的呢?
根装载器主要负责装载JRE的核心类库,入JRE目标下的rt.jar、charsets.jar等;
ExtClassLoader和AppClassLoader都是ClassLoader的子类,ExtClassLoader负责装载JRE扩展目录ext中的JAR包;AppClassLoader负责装载Classpath路径下的类包。
这三个类装载器之间的父子关系是:根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下,使用AppClassLoader装载应用程序的类,如下面这个例子所示:
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@1c78e57
parent loader:sun.misc.Launcher$ExtClassLoader@5224ee
grandparent loader:null
可以知道当前的ClassLoader是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader是根装载器,因为在java中无法获得它的句柄,所以返回null。
于是我们可以联想到JVM装载类时使用的“全盘负责委托机制”。因为ClassLoader装载一个类时,永远是由根装载器来装载的,只有在找不到类时才从自己的类路径中查找并装载目标类,于是避免了有人编写了一个恶意的基础类(如java.lang.String)并装载到JVM中所带来的可怕后果。
比如说:我们单独写一个java.lang.String:
package java.lang;
public class String {
public String(String msg) {
System.out.println("String");
System.out.println(msg);
}
}
那么我们在其他类调用java.lang.String会出现什么结果呢,比如
System.out.println(new String("myString"));
结果是什么?一试便知。
分享到:
相关推荐
类装载器ClassLoader1
在学习过程中,可能会遇到一些混淆的问题,比如类装载器的委托模型、类的加载顺序以及如何自定义类装载器以加载非标准路径的类。理解这些概念有助于解决实际开发中遇到的类加载问题,例如,当需要加载外部库或者...
在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...
Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...
Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...
3. **App ClassLoader**(应用程序类装载器):这是默认的类装载器,负责加载应用程序类路径(ClassPath)所指定的类。 此外,还可以自定义类装载器以满足特定需求,比如热部署(Hot Deployment)、模块化加载等。 ...
在Java虚拟机(JVM)中,类装载器(ClassLoader)是至关重要的组成部分,它负责查找和加载Java类到JVM内存中。本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几...
Java的JVM(Java Virtual Machine)类装载器是Java运行时系统的重要组成部分,负责在程序运行期间查找并加载类的二进制数据。理解类装载器的工作原理对于优化Java应用性能和实现动态加载类至关重要。 装载过程包括...
在开发过程中,你需要注意类装载器的双亲委托模型,这是一种安全机制,确保核心类库不会被非法替换,避免类的冲突。 编写自定义类装载器时,你可能会遇到的问题包括类的加载顺序、类的可见性、类的唯一性以及如何...
当一个类被加载时,它首先会尝试由当前线程的Context ClassLoader进行加载,如果该类加载器无法加载,则向上委托给父类加载器,直至Bootstrap ClassLoader。这种设计可以避免类的重复加载,同时保证核心库的稳定性和...
类加载遵循“双亲委托模型”,即当一个类加载器收到加载类的请求时,它会首先委托父类加载器尝试加载,只有当父类加载器无法找到对应的类时,才会自己尝试加载。这样保证了基础类库的一致性,同时也允许Web应用覆盖...
这一过程涉及到了四个主要角色:类装载器(ClassLoader)、类的二进制表示、验证(Verification)、准备(Preparation)以及初始化(Initialization)。下面我们将逐一解析这些环节。 1. **类装载器**: 类装载器...
在该模型下,当一个ClassLoader收到加载类的请求时,它首先会委托父加载器去尝试加载,只有当父加载器无法加载时,当前加载器才会尝试自己加载。这样设计避免了类的重复加载,并确保了核心类库的唯一性。 四、...
了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对ClassLoader API的使用和自定义的详细说明。 首先,我们来看ClassLoader的基本概念。在Java中,...
Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...
理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先,我们来了解一下ClassLoader的基本层次结构。在Java中,ClassLoader分为三个主要层次:Bootstrap ClassLoader、...
通过对`ClassLoader`的基本概念、工作原理、双亲委托机制以及不同类型的类加载器的了解,我们可以更好地理解Java类加载的过程及其背后的设计哲学。这对于深入理解Java虚拟机的内部机制以及开发高质量的应用程序都至...
《深入Java虚拟机(七)深入源码看java类加载器ClassLoader》 Java类加载器(ClassLoader)在Java运行环境中扮演着至关重要的角色。它负责将类的字节码加载到Java虚拟机(JVM)中,使得程序能够运行。ClassLoader是...