JVM在运行时会产生三个ClassLoader
1.Bootstrap ClassLoader
c++编写的,启动JVM时调用的类加载器,主要用来加载JRE_HOME/lib当前目录下的核心jar,例如:rt.jar,jsse.jar等。
2.Extension ClassLoader
用来加载JRE_HOME/lib/ext当前目录下核心扩展的jar,例如:dnsns.jar等
3.AppClassLoader
AppClassLoader是加载Classpath下所有的jar和classes
这3种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。确切地说,如果一个类装载器被请求装载一个java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,如果返回已装载,则该类装载器将不会装载这个java.lang.Integer,如果上一级的类路径装载器返回未装载,它才会装载java.lang.Integer。
类似的,类路径装载器收到请求后(无论是直接请求装载还是下一级的ClassLoader上传的请求),它也会先把请求发送到上一级的标准扩展类装载器,这样一层一层上传,于是Bootstrap ClassLoader优先级最高,如果它按照自己的方式找到了java.lang.Integer,则下面的ClassLoader 都不能再装载java.lang.Integer,尽管你自己写了一个java.lang.Integer,试图取代核心库的java.lang.Integer是不可能的,因为自己写的这个类根本无法被下层的ClassLoader装载。这也是所谓的“沙箱”原理。
除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。
ClassLoader的getParent()方法返回委托的父类加载器。一些实现可能使用 null 来表示引导类加载器。如果类加载器的父类加载器就是引导类加载器,则此方法将在这样的实现中返回 null。
public class TestClassLoader {
public static void main(String[] args) {
Class<?> clazz = null;
ClassLoader clazzLoader = ClassLoader.getSystemClassLoader();
System.out.println("ClassLoader.getSystemClassLoader() = " + clazzLoader);
while (clazzLoader != null) {
clazzLoader = clazzLoader.getParent();
System.out.println(clazzLoader);
}
System.out.println("end while.");
try {
clazz = Class.forName("java.lang.Object");
clazzLoader = clazz.getClassLoader();
System.out.println(" java.lang.Object's loader is " + clazzLoader);
clazz = Class.forName("sun.net.spi.nameservice.dns.DNSNameService");
clazzLoader = clazz.getClassLoader();
System.out.println(" sun.net.spi.nameservice.dns.DNSNameService's loader is " + clazzLoader);
// clazz = Class.forName("TestClassLoader");
// clazzLoader = clazz.getClassLoader();
clazzLoader = TestClassLoader.class.getClassLoader();
System.out.println(" com.dextrys.test.TestLoade's loader is " + clazzLoader);
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
ClassLoader.getSystemClassLoader() = sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
end while.
java.lang.Object's loader is null
sun.net.spi.nameservice.dns.DNSNameService's loader is sun.misc.Launcher$ExtClassLoader@addbf1
com.dextrys.test.TestLoade's loader is sun.misc.Launcher$AppClassLoader@19821f
分享到:
相关推荐
双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...
在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。
《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...
Java的类加载机制是其运行的核心部分,它涉及到如何将`.class`文件转换为内存中的类实例。在Java中,`ClassLoader`是负责这个过程的关键组件。本文将深入探讨ClassLoader的工作原理,Java类的结构,以及Java类的动态...
最后,App ClassLoader加载的是应用类路径(ClassPath)中的类。 ClassLoader的工作流程主要包含以下步骤: 1. **查找类**:当JVM需要加载一个类时,ClassLoader会根据类名(全限定名,如`java.lang.String`)在...
在Java编程语言中,类加载机制(ClassLoader)是理解JVM(Java Virtual Machine)工作原理的关键部分。它负责将.class文件从磁盘加载到内存中,使得Java程序能够执行。这个过程包括加载、验证、准备、解析和初始化五...
《深入理解ClassLoader工作机制》 Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、...
2. **双亲委派模型**:Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它会先委托给父类加载器去加载,只有当父类加载器无法加载时,当前类加载器才会尝试自己加载。这种设计有助于防止...
例如,Bootstrap ClassLoader加载的核心类库不会被其他类加载器重新加载。 #### 五、自定义类加载器 虽然Java提供了默认的类加载器,但在某些情况下可能需要自定义类加载器来满足特定的需求,如实现热部署、动态...
Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
### Java 类加载机制详解 #### 一、引言 Java 类加载机制是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译后的字节码文件(.class)加载到内存中,形成Class对象,以便于Java程序能够识别并使用这些类。深入...
在Java编程语言中,...然而,这也需要开发者对Java的内存管理和类加载机制有深入的理解,以便正确且安全地使用。通过研究"InternalsOfClassloadingSrc"这样的项目,我们可以更深入地学习和实践ClassLoader的定制。
文章作者Github jiqimaogou类似项目 Nuwa这个项目涉及自动化那块做的很完整,感兴趣的可以去看看##详细说明 ### 制作该技术的帖子的原理很简单,其实就是用ClassLoader加载机制,覆盖掉有问题的方法。所以我们的帖子...
通过分析这些源代码,我们可以更深入地理解如何实现ClassLoader的动态加载机制。 总结来说,Android的ClassLoader动态加载dex是一种高级技巧,它可以让我们在不更新整个APK的情况下实现功能更新。这涉及到对Android...
这种委托加载机制保证了类的唯一性,防止了同一个类被不同ClassLoader加载两次的问题。 ClassLoader还有自定义的概念,允许开发者创建自己的ClassLoader来实现特定的加载逻辑。例如,从网络、数据库或特定文件系统...
Java类加载机制是Java平台设计的核心部分之一,它负责将.class文件从磁盘或网络中读取,并转换成运行时的Java对象。本篇将深入探讨这一机制的各个方面,包括类加载器、类加载过程以及双亲委派模型。 首先,我们要...