一、 什么是ClassLoader?
“A class loader is an object that is responsible for loading classes”——java.lang.ClassLoader;
显而易见,classLoader就是类加载器的意思,通过它将类(从.class文件到jvm中的class)加载到jvm中;
但是classLoader也是一个Object,它是怎么加载到jvm中的呢,不是所有的java类都是通过classLoader加载的吗?
所以,肯定有一个classLoader不需要通过类加载来装入jvm;
jvm中的bootstrap classloader就是这样的一个类加载器,它是jvm实现的一部分。
二、 JVM有哪些ClassLoader?
明白了什么是classLoader,那么classLoader有哪些呢?
上面提到JVM自己实现了一个ClassLoader——BootstrapClassLoader;和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。
另外,jvm还提供了两个类加载器,ExtensionClassLoader和SystemClassLoader;
他们都是用java编写的,都是java.lang.ClassLoader的子类,由Bootstrap ClassLoader加载后才能使用;
其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),System ClassLoader负责加载应用程序自身的类。
当然,开发者自己也可以实现自定义的classLoader。
总之,JVM中包含的ClassLoader有:
- Bootstrap ClassLoader,负责加载核心JavaClass(例如所有java.*开头的类)
- Extension ClassLoader,负责加载扩展的Javaclass(由变量-Djava.ext.dirs决定,默认为jdk1.6.0_32/jre/lib/ext;/usr/java/packages/lib/ext),
- System ClassLoader,负责加载应用程序自身的类。
这三个类加载器存在parent关系,但这个parent不是指的继承的关系,而是他们的实例被谁加载的关系; System ClassLoader的Parent是Extension ClassLoader,而Extension ClassLoader的Parent为Bootstrap ClassLoader。
理论总是枯燥的,还是动手实现吧,通过代码查看他们parent,如下:
public static void main(String[] args) {
System.out.println(ClassLoader.getSystemClassLoader().getParent());
System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
}
输出为:
sun.misc.Launcher$ExtClassLoader@42e816
null
ExtClassLoader的parent不是java类,所以为null。
--------------------------------------------------------------------------------------
补充:类加载器对应的java类
bootstrap classloader -------- 对应jvm中某c++写的dll类
Extenson ClassLoader ---------对应Launcher内部类ExtClassLoader
System ClassLoader --------对应Launcher内部类AppClassLoader
User Custom ClassLoader ---对应任何自定义的URLClassLoader子类(也可以继承SecureClassLoader或者直接继承ClassLoader)
--------------------------------------------------------------------------------------
三、 ClassLoader加载机制
classloader 加载类用的是全盘负责双亲委托机制;
全盘负责就是加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;
双亲委托机制则是先让parent类加载器寻找,只有在parent找不到的情况下才在自己的类路径中去寻找;
此外类加载还采用了cache机制,如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换Class,并存入cache;这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。
四、 ClassLoader加载class的过程
知道了classLoader的加载机制,那么加载class的过程也就很容易理解了,如下:
1) 检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
2) 如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
3) 请求parent classloader载入,如果成功到8,不成功到5
4) 请求jvm从bootstrap classloader中载入,如果成功到8
5) 寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.
6) 从文件中载入Class,到8.
7) 抛出ClassNotFoundException.
8) 返回Class.
其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。
五、自定义ClassLoader
现在已经了解了classloader的原理和加载机制,那么我们可以实现一个自定义的classLoader。
实现自定义classLoader,我觉得最根本的目的是为了使用自定义的classPath,其实有多种方式来满足这个需求,例如
- 生成URLClassLoader的时候指定自定义的classPath,可以实现运行时的动态加载;
- 通过继承URLClassLoader来实现自定义的classLoader,使用URLClassLoader的寻址逻辑,加载自定义的ClassPath;
- 通过继承ClassLoader来实现自定义的classLoader,可以实现自定义的classPath寻址和class文件的读取;
当然还有其他的方式可以实现自定义的classLoader,重要的是根据不同的需求来实现合适的ClassLoader。
分享到:
相关推荐
ClassLoader是JVM中的一个重要组件,它的主要任务是加载类的二进制数据,转换为Class对象,并供Java应用程序使用。本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种...
而JVM代理(JVM Agent)和类加载器(ClassLoader)则是两个关键的概念,它们对于深入理解Java应用程序的运行机制至关重要。 **JVM代理** JVM代理是一种在JVM启动时或者运行时插入额外功能的方式,它允许开发者在不...
native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...
在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...
OSGi 最重要的特性是在 Java 中 ClassLoader 是非常重要的概念,而大家也知道,JVM 本身在ClassLoader 上并没有提供非常强大的功能,比如模块开发非常重要的模块隔离 ClassLoader 的机制、版本加载机制等。...
在JVM的运行机制中,ClassLoader起着至关重要的作用。ClassLoader负责查找并加载类到JVM中,使得程序得以运行。本篇将深入探讨ClassLoader的源码,通过实例解析其工作原理。 ClassLoader的基本工作流程可以概括为...
5. **JVM ClassLoader机制**:ClassLoader负责加载类到JVM中,包括Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。类加载遵循双亲委派模型,确保类加载的唯一性。 6. **Java中的synchronized使用...
Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、初始化、使用和卸载。这些阶段共同...
1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...
通过创建自定义ClassLoader,你可以定制JVM,使类文件的引入方式完全重新定义,这提供了很多实用和有趣的可能。这篇教程将对Java ClassLoader进行概述,并指导你构建一个示例ClassLoader,该ClassLoader可以自动编译...
为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...
- JVM ClassLoader:Java虚拟机的类加载器,用于加载Java类。 4. Java网络编程 - Java Servlet中的request和response对象处理:它们是HTTP通信中客户端请求和服务器响应的抽象。 - HTTP协议相关概念:如请求方法...
- **Bootstrap ClassLoader**:JVM级别的类加载器,负责加载`$JAVA_HOME/jre/lib`下的所有类库,不由Java实现,开发者无法直接操作。 - **Extension ClassLoader**:负责加载Java平台扩展功能的jar包,如`%JRE_HOME/...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...
【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...
Bootstrap ClassLoader并非继承自java.lang.ClassLoader,而是由JVM直接实现,因此在Java代码中无法直接获取和操作。它加载的类库路径可以通过-Xbootclasspath或-Dsun.boot.class.path系统属性进行设置。 2. ...