一、类加载器(ClassLoader)

1.1 什么是类加载器

  Java的类加载器是Java虚拟机(JVM)的重要组成部分,它的主要作用是动态地将Java类加载到JVM中,以便在运行时使用这些类。Java类加载器通常是由JVM的实现者提供的,但用户也可以通过扩展ClassLoader类来定义自己的类加载器。

  Java类加载器采用了双亲委派模型,即在加载一个类时,会先由父类加载器尝试加载该类,如果父类加载器无法加载,则交给子类加载器去尝试加载。这样可以确保Java类的唯一性,同时也可以防止Java类库被恶意篡改。

  Java类加载器可以分为三个层次:启动类加载器、扩展类加载器和应用程序类加载器。启动类加载器是JVM的一部分,用于加载Java核心类库,扩展类加载器用于加载JVM扩展的一些API,而应用程序类加载器则用于加载应用程序中的类。

1.2 类加载器的三个层次

  1. 启动类加载器

  启动类加载器(Bootstrap ClassLoader)是Java虚拟机的一部分,是用本地代码实现的类加载器,主要用于加载JRE/lib目录下的核心Java类库,如rt.jar、charsets.jar等。启动类加载器是Java虚拟机最顶层的类加载器,它没有父类加载器。

  启动类加载器使用C++编写,因此无法在Java代码中获取到它的引用。启动类加载器加载的类不受限于类路径的限制,因为它在Java虚拟机启动时就已经被加载了。

  1. 扩展类加载器

  扩展类加载器(Extension ClassLoader)是由Java代码实现的类加载器,它的父类加载器是启动类加载器。扩展类加载器用于加载Java扩展API,这些API通常存放在JRE/lib/ext目录下,如jconsole.jar、jmxremote.jar等。

  扩展类加载器在Java虚拟机启动时会被创建,它的类加载路径可以通过系统属性java.ext.dirs来指定。如果要使用自定义的扩展类加载器,也可以通过设置java.system.class.loader系统属性来指定。

  1. 应用程序类加载器

  应用程序类加载器(Application ClassLoader),也称为系统类加载器(System ClassLoader),是Java虚拟机中最常用的类加载器,它的父类加载器是扩展类加载器。应用程序类加载器用于加载应用程序中的类,通常存放在CLASSPATH环境变量或者-cp命令指定的目录下。

  当Java虚拟机需要加载一个类时,会先让应用程序类加载器尝试加载该类,如果应用程序类加载器无法加载,则会依次由其父类加载器进行加载,直到启动类加载器为止。

  如果应用程序类加载器的父类加载器无法找到某个类,应用程序类加载器也无法加载该类,因为Java类加载器采用双亲委派模型,即父类加载器优先委派给子类加载器进行加载。

  1. 其他

类加载器可以通过getClassLoader()方法获取到:

例如:

public class TestClassLoader {public static void main(String[] args) {System.out.println(TestClassLoader.class.getClassLoader());System.out.println(TestClassLoader.class.getClassLoader().getParent());System.out.println(TestClassLoader.class.getClassLoader().getParent().getParent());}
}

结果:

jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc
jdk.internal.loader.ClassLoaders$PlatformClassLoader@58ceff1
null

由此可见应用程序类加载器和扩展类加载器都可以被获取到,而启动类加载器因为是由C++所编写的所以获取时为空;

加载特性:

自顶向下尝试加载,自底向上检查是否加载成功;

类加载器(ClassLoader)相关推荐

  1. Java虚拟机学习 - 类加载器(ClassLoader)

    类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...

  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  3. 【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )

    文章目录 一.Android 类加载器 1.ClassLoader 抽象类 2.BootClassLoader 3.BaseDexClassLoader 4.PathClassLoader 5.Dex ...

  4. 【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )

    文章目录 一.类加载器 二.类加载的双亲委托机制 一.类加载器 Java 虚拟机 ClassLoader 类加载器 : Bootstrap ClassLoader : 启动类加载器 , 该 加载器由 ...

  5. java类加载器_类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...

  6. JVM之类加载器ClassLoader

    JVM之类加载器ClassLoader 本文目录 JVM简介 类加载器解析 1. JVM简介 ①. JVM是运行在操作系统之上的,它与硬件没有直接的交互 ②. JVM体系结构概览 注: 2. 类装载器 ...

  7. 类加载器ClassLoader的角色

    类加载器ClassLoader的角色

  8. Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)

    Student s = new Student(); s.play(); Student s2 = new Student(); 以上代码的执行流程如下: JVM 作为操作系统的一个迚程在系统中执行, ...

  9. 类加载器ClassLoader

    类加载器ClassLoader 基本介绍 与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class ...

  10. java的类加载器ClassLoader

    类在执行之前会执行三个步骤:加载 ->   连接  -> 初始化 1.java中类的加载 java 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方 ...

最新文章

  1. 汇集82万开发者,拿下7项世界冠军的科大讯飞有何魅力?
  2. php-fpm的pool、php-fpm慢执行日志、open_basedir、php-fpm进程管理
  3. ftp 工具_ftp工具,ftp工具如何下载使用?Linux如何配置ftp服务器?
  4. php开发app接口教学,php开发App接口
  5. RuoYi(分离版) 使用代码生成器添加子模块(idea版)
  6. mysql 5.7.12 修改密码
  7. Android进程优先级architecture : low memory killer (/system/core/lmkd/lmkd.c)
  8. 雨滴桌面时间插件_Win10美化向——如何搭配你的桌面
  9. cocosBuilder使用总结
  10. 前端开发之谷歌实用插件fehelper JSON助手
  11. VB显示透明FLASH效果
  12. php安装Laravel框架 全过程 傻瓜式教学
  13. #Redis数据库-思维导图
  14. safenet 超级狗 加密狗
  15. 基于Processing的躲避球游戏
  16. 【JS Web 前端知识库】6.说一说BFC
  17. Goland 1.15运行报错:该版本的 %1 与你运行的 Windows 版本不兼容
  18. PHP套件的实验结果分析,PHP环境搭建套件评比测 | Wopus
  19. Canvas百战成神-圆(1)
  20. IPv6技术精要(第2版)Rick Graziani

热门文章

  1. 世界四大名刊Cell,Nature,Science,PNAS
  2. 超级科学计算机bug,10%+10%=0.11?一个隐藏的BUG!手机计算器几乎全算错!
  3. 杭电 HDU 1248 Java寒冰王座
  4. 耐克人脸识别_人脸识别启动,全系9个车型随意选,买它立马有1.2万现金拿
  5. GANSYNTH(基于对抗性神经网络的音频合成)
  6. 3D游戏编程:第5次作业
  7. 19篇顶会论文探索多模态情感识别前沿进展
  8. 继电器学习笔记(二)---继电器主要参数(结合宏发继电器HF32FV-G 规格书)
  9. 设计比赛-我图杯原创设计比赛_我图网www.ooopic.com_第一期:中国风原创设计比赛
  10. 视频文件怎样进行压缩缩小