Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader
和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader
Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库,在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。
AppClassLoader用来加载Classpath的类,是和我们关系最密切的类。
URLClassLoader用来加载网络上远程的类,暂且不讨论。
它们之间的关系:
1.Parent-Child,按顺序从大到小。不是简单的继承关系。
2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。
3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent
比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException
4.类A调用类B,B会要求调用它的类的类加载器来加载它,也就是B会要求加载A的加载器来加载B。这就会有个问题,如果他们在一起,那没关系,肯定某个classloader会把它们俩都加载好。但是如果A在/lib/ext文件夹中,而B在Classpath中呢?过程是这样的首先加载A,那么一层层上到Bootstrap Classloader,boot没找到所以ext自己找,找到了,没问题;加载B,因为A调用了B,所以也从bootstrap来找,没找到,然后A的ext classloader来找还是没找到,但是再也不会往下调用了,于是报出ClassNotFoundException。
但是现实生活中有很多应用,比如JDBC核心方法在核心库而驱动在扩展库,是必定在两个地方的,那怎么办呢?要用到Context ClassLoader我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.
分享到:
相关推荐
1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,负责加载Java的核心库类,如`java.lang`包下的类。 2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统...
### Java基础知识点详解 #### 一、Java语言的历史与地位 - **计算机语言的历史:** - **第一代语言(机器语言)**:基于0和1的二进制代码,直接与硬件交互,例如早期的打孔机。 - **第二代语言(汇编语言)**:...
在深入探讨Java入门基础知识之前,我们首先需要澄清一些概念。Java和JavaScript虽然名字相似,但实际上它们是两种完全不同的编程语言。Java是由Sun Microsystems(现已被Oracle收购)开发的面向对象的编程语言,适用...
Java 常用基础知识是程序员面试中不可或缺的部分,尤其对于准备进入阿里巴巴、腾讯、京东、百度、美团、去哪儿等互联网公司的求职者来说,掌握这些知识至关重要。以下是对这两个问题的详细解析: 1. 类加载问题:...
然而,我可以根据标题和描述中要求的知识点,给出关于Java ClassLoader的一些深入知识点。 Java ClassLoader是Java运行时环境中用于动态加载Java类到JVM(Java虚拟机)的一个组件。深入理解ClassLoader是深入理解...
下面将详细讲解标题和描述中提及的一些核心Java基础知识。 1. **Java中的引用概念**:在Java中,引用是对象的一个指针,它指向内存中的对象实例。有强引用、软引用、弱引用和虚引用四种类型,分别对应不同的内存...
= 秘书 = 类加载器 = ClassLoader = 保镖 = 字节码校验器 = ByteCode Verifier = 翻译 = 解释执行器 = Interfreter 2:安全 健壮 电力 电信 银行 都会有限考虑使用java实现 3:免费 开源 4:简单 语法简单...
上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...
Java基础知识是学习Java编程的基石,对于初学者来说至关重要。以下将详细讲解这些知识点: 1. 类的修饰符: - default(默认修饰符):若无任何修饰,类仅能在同一包内的类中访问。 - public:类可被任何地方的类...
### Java基础知识与面试题详解 #### 基本数据类型 Java中定义了八种基本数据类型:`byte`、`short`、`int`、`long`、`boolean`、`double`、`float`、`char`。这些类型在内存中占用固定的字节数,其中`byte`类型...
Java基础思维导图对应html版本资源: 类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap ...
### Java私塾基础入门笔记概览 #### 一、Java简介与版本 Java是一种功能强大的计算机编程语言,它不仅是一种软件开发平台,还是一种软件...掌握这些基础知识是学习Java编程的起点,为进一步深入学习打下坚实的基础。
Java基础知识是编程领域中至关重要的一个部分,尤其对于软件开发人员来说,理解并掌握这些基本概念是成为Java程序员的第一步。本节将深入探讨Java线程间通信、Java类加载器以及JVM内存模型这三个核心知识点。 首先...
以上只是Java基础知识的冰山一角,深入学习Java还包括设计模式、网络编程、数据库连接、反射、注解、NIO等高级主题。Java的强大之处在于它的全面性、稳定性和广泛的应用场景,使其成为软件开发的首选语言。
Java是世界上最流行的编程语言之一,由Sun Microsystems在1995年首次推出。它是一种多范式的、面向对象的语言,以其“一次编写,到处运行”的...理解并熟练掌握这些基础知识,对于成为一名优秀的Java开发者至关重要。
了解Java反序列化的基础知识有助于深入理解类加载机制,特别是在安全性、自定义类加载和内存管理方面。下面我们将详细讨论Java的类加载过程以及如何利用自定义类加载器实现反序列化。 1. **类加载流程**: - 当...
通过这五步骤的学习和实践,初学者就可以掌握 Java 的基础知识,拥有了 Java 自学的能力,可以继续学习和实践更多的 Java 知识。 在学习 Java 的过程中,需要反复揣摩和实践,需要掌握每个知识点的细节和应用。需要...
Java提供了三个基础类加载器:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader,它们按照层次结构加载类。 1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态...