什么是ClassLoader
ClassLoader负责将 Java 字节码装载到 JVM 中。ClassLoader本身是一个抽象类,我们用它的子类的实例对象来装载类。通常我们通过类名读入一个class文件来加载一个类。
classloader 层次结构图
java虚拟机内部一般用三个classLoader来完成类的加载工作。
1. Bootstrap ClassLoader (启动类加载器)
----由c++实现。没有parent。启动类加载器负责加载java核心库代码
2. ExtClassLoader (扩展类加载器)
----继承自URLClassLoader,双亲是Bootstrap ClassLoader。负责从java.ext.dirs扩展目录中加载类
3. AppClassLoader (系统类加载器)
----继承自URLClassLoader,双亲是ExtClassLoader。负责从CLASSPATH路径中加载应用程序代码。
除虚拟机自带的一些类装载器外,还有一些用户自定义的类装载器。
ClassLoader装载的委托模式
首先, 每一个自定义类装载器在创建时被指定一个“双亲”parent类装载器。如果在构造方法中未显式指定parent类装载器,系统类装载器就默认被指定为parent类装载器。如果传递null,则意味着指定启动类装载器为parent.
启动类装载器没有parent。
那么,类装载器之间的双亲孩子关系用来做什么呢? 它们构成了一条装载工作的委托链。 装载一个类时,先由自己定义的类装载器请求其parent装载,parent再请求它自己的parent装载,直到顶级的Bootstrap ClassLoader。 若某一级的parent能装载则装载之,否则由它的“下级”自己尝试装载。
ClassLoader.java 中的loadClass方法代码如下:
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
由代码结合前面的层次结构图可知,装载一个类时的优先次序为:
启动类装载器 => 扩展类装载器 => 系统类装载器 => 用户自定义的类加载器
这也以为着首先会在最可信的JAVA核心类库中查找要装载的类,依次再去扩展路径、系统类路径(CLASSPATH)中查找,防止用户不可靠的类覆盖可信的系统类,从而提高安全性。
ClassLoader的命名空间
由不同的类装载器装载的类被虚拟机放入不同的命名空间。可近似理解为虚拟机为每个由类装载器装载的类安排了一个唯一标识,形如:ClassLoaderName.packageName.ClassName. 这意味着:由同一个加载器加载的不同类拥有不同的标识;由不同类加载器加载的同一个类,其标识也不同。
虚拟机为每一个类装载器维护一张列表,列表中是已经被装载的类型的名字。 这个列表可以保证同一个类型不会被同一个装载器装载超过一次。
这里java虚拟机对命名空间的访问做了一些限制,具体有两条:
1. 同一命名空间内的类可直接交互(双向)。不同命名空间的类一般不可交互,除非使用反射等显式指定的交互机制或者符合条件2.
2. 类型可以共享。如果某个类加载器A把类型C委托给双亲委托链中的另一个加载器B,且B完成了实际装载工作,那么C在从A到B的这段双亲委托链的命名空间中共享,即C可以访问这些装载器所装载的其它类(单向的)。 by the way, 这也是我们可以直接在自己代码中使用java 核心库API的原因,因为他们被Bootstrap Loader装载。
Over~
- 大小: 6.7 KB
分享到:
相关推荐
### Java ClassLoader理解详解 #### 一、引言 在商业流行的编程语言中,Java以其独特的运行机制脱颖而出:它在Java虚拟机(JVM)上运行。这意味着编译后的程序采用一种特殊的、与平台无关的格式,而不是针对特定...
理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将深入探讨Java ClassLoader的内部工作,并通过一个具体的实例来展示如何定制自己的ClassLoader。 ...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...
深入Java 2 SDK.pdf`可能涉及的是Java与其他工具和技术的集成,如与微软Office的交互、使用Visual Studio .NET管理Java应用、Ant构建工具的使用以及对Java 2 SDK的深入理解,这些都可能间接地涉及到ClassLoader的...
### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...
理解ClassLoader的工作原理对于优化Java应用程序性能以及解决类冲突等问题具有重要意义。 一、ClassLoader的基本概念 Java程序由多个类组成,每个类对应一个.class文件。当程序运行时,ClassLoader根据需要动态...
### Java ClassLoader原理详解 #### 摘要 本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。...了解和掌握这些概念对于深入理解和高效利用Java平台至关重要。
了解 Java 类加载机制可以帮助我们更好地理解 Java 的运行机制,并且可以帮助我们更好地编写 Java 程序。 知识点总结: * Java 类加载机制是 Java 中一个非常重要的机制,它负责加载 Class 文件到 JVM,以供程序...
总结,Java ClassLoader是Java平台的关键特性,理解其工作原理和应用场景对于优化系统性能、设计可扩展的系统至关重要。通过本教程,读者应能掌握如何利用ClassLoader实现动态加载、安全隔离和版本控制等功能,提升...
通过对Java ClassLoader的深入了解,我们可以更好地理解Java类的加载机制以及如何通过自定义ClassLoader来满足特定的应用需求。淘宝网的成功实践为我们提供了宝贵的参考案例,展示了ClassLoaders在实际项目中的重要...
Java 类加载器(ClassLoader)是Java虚拟机(JVM)中的一个重要组成部分,它负责加载类的字节码文件,使得程序能够运行。深入理解ClassLoader对于优化应用性能、处理类加载问题以及实现自定义加载策略至关重要。 一...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
《深入理解Java类加载器:基于classloader-playground开源项目》 在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为...
理解ClassLoader的工作原理对于深入学习Java以及进行JVM优化、插件开发等高级技术至关重要。下面将详细介绍Java ClassLoader的基本概念、工作流程、类加载机制以及自定义ClassLoader。 1. **ClassLoader基本概念** ...
理解Java类加载器:深入解析与实践 在深入探讨Java类加载器(ClassLoader)之前,我们首先需要了解它在Java运行时系统中的核心作用。类加载器是Java虚拟机(JVM)的一个关键组成部分,负责查找、加载和链接类文件到...
Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...
Java ClassLoader是Java运行时系统的关键但经常被忽视的组件,负责在运行时查找和加载类文件。通过创建自定义ClassLoader,你可以定制JVM,使类文件的引入方式完全重新定义,这提供了很多实用和有趣的可能。这篇教程...