转载自 Java高级篇——深入浅出Java类加载机制

类加载器

简单讲,类加载器ClassLoader的功能就是负责将class文件加载到jvm内存。

类加载器分类

从虚拟机层面讲分为两大类型的类加载器,一是Bootstrap Classloader即启动类加载器(C++实现),它是虚拟机的一部分,二是其他类型类加载器(JAVA实现),在虚拟机外部,并全部继承ClassLoader类。

从细分的角度讲会分为以下三类类加载器:

1、Bootsrap ClassLoader

启动类加载器,完全由jvm控制加载,外面访问不到这个类加载器,即不能被java程序引用。它主要负责加载jvm自身的工作类,即java/lib目录和-Xbootclasspath参数指定的目录的类库。

2、Extension ClassLoader

扩展类加载器,由java实现,即ExtClassLoader实现类。它主要负责加载java/lib/ext目录和系统环境变量java.ext.dirs指定目录所有类库。

3、Application ClassLoader

应用程序类加载器,由java实现,即AppClassLoader实现类。它的父类是ExtClassLoader,它主要负责加载classpath目录上的类库。如果没有自定义ClassLoader,它就是程序中默认的ClassLoader,即可以通过ClassLoader.getSystemClassLoader()获取当前系统的类加载器。

从上图看虽然Bootstrap ClassLoader是最顶层的类加载器,但是不能被程序引用,它也不是ExtClassLoader的父类加载器,ExtClassLoader没有父类载器,我们不防来看下面简单的例子。

程序首先输出了程序默认的类加载器AppClassLoader,然后再输出了其父类加载器ExtClassLoader,然后就完了,这就证实了上面的理论。

类加载机制

虽然定义了上面这几个类加载器,但在加载时类加载器会审查一个class类应该由哪个类型的加载器负责加载,它使用的是等级加载机制,是一种双亲委派模型。

双亲委派模式要求所有类加载器,除了顶层的Bootstrap类加载器之外都要有自己的父类加载器。在收到一个类加载请求时,当前默认的类加载器它不会首先自己来加载这个类,它会委托给自己的父类加载器去加载,父类加载器再委托给父父类加载器,以此类推,直到顶层类加载器,由上到下加载,除非上面的类加载器都无法加载时自己才去加载。

来看看ClassLoader.loadClass方法源码

再回到之前文章中的有一道关于是否可以自定义类java.lang.String并使用的面试题,它在java/lib目录下,所以当应用类加载器去classpath加载时会去委托父类加载器,这时最顶层类加载器会发现自己之前已经加载过,所以这次不再加载,所以自定义的这个java.lang.String虽然可以正常编译,但不能被类加载器加载并使用。

所以,这也是双亲委派模式的好处,同一个路径的类保证不能加载两次,保证了类与类之间的正常行为和正常运行。

Java高级篇——深入浅出Java类加载机制相关推荐

  1. JAVA高级篇之Java Reflection详解

    目录 概念 Java programming language and JVM modeling in core reflection 场景 Class加载 ClassLoad加载 Class加载 通 ...

  2. 【Java虚拟机规范】JVM类加载机制

    [Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...

  3. elasticsearch - java - 高级篇 - 封装类 - 2

    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程. -侯氏工坊 文章目录 说明 参考 核心封装类 新增类 说明 高级篇是自我封装的一个进化过程 封装类并不是固定不变 ...

  4. Java高级篇-0-为什么要掌握Java高级篇知识

    好长时间了,就想要花时间系统去学习下Java的高级篇知识,这部分是我个人目前比较欠缺的,而且是急缺的知识.我认为的Java高级篇内容是这样划分的:对Java这个编程语言有基本了解,基本掌握了基础语法, ...

  5. Java核心篇之Java锁--day2

    Java核心篇之Java锁–day2 乐观锁:乐观锁是一种乐观思想,即认为读多写少,每次去取数据的时候都认为其他人不会修改,所以不会上锁:但是在更新的时候会判断一下在此期间别人有没有去修改它,如果有人 ...

  6. Java内存管理-掌握虚拟机类加载机制(四)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍了整个JVM运行时的区域,以及简单对比了JDK7和JDK8中JVM运行时区域 ...

  7. 2022金三银四面试总结-Java高级篇

    Java面试总结 1.你用过哪些集合类? 大公司最喜欢问的Java集合类面试题 40个Java集合面试问题和答案 java.util.Collections 是一个包装类.它包含有各种有关集合操作的静 ...

  8. 【鲁班学院】面试总结:Java高级篇(上):集合的类型以及重新认识HashMap

    1.你用过哪些集合类? 大公司最喜欢问的Java集合类面试题 40个Java集合面试问题和答案 java.util.Collections 是一个包装类.它包含有各种有关集合操作的静态多态方法. ja ...

  9. 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )

    文章目录 一.Android 类加载机制 二.双亲委派机制 一.Android 类加载机制 Android 中的类加载 使用了 双亲委派 机制 , 如下图所示 : 在 Android 中提供了 333 ...

最新文章

  1. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)
  2. HOG 特征计算实现
  3. 百度第七期智能对话训练营来了!
  4. iPhone开发中的一些小技巧
  5. 解决ubuntu中vi不能正常使用方向键与退格键的问题
  6. RecyclerView局部刷新机制——payload
  7. redhat 挂载 iso文件 提示 mount :not a directory
  8. CImage类的用法(转帖)
  9. 前端设置画布的高度_【后期修图】ps画布设置详解
  10. mysql sql语句 datediff_MySQL数据库之MySQL DATEDIFF 函数
  11. 微信小程序创建一个新项目
  12. 点击搜索到获得结果之间的零点几秒 都发生了什么?
  13. 好用的Mac数据恢复软件在这里
  14. python四则运算表达式,用Python自动生成小学四则运算题目2.0版
  15. Linux系统无法在spyder5中输入中文的解决办法
  16. CLSR 11.1直接寻址表
  17. 怀孕必读(非常实用)-怀胎的历程及注意事项
  18. 汇编语言中xor指令_这个汇编代码有什么作用? (TEST,XOR,JNZ)
  19. C语言中 .h文件和.c文件的区别 (转)
  20. 详解floor函数、ceil函数和round函数

热门文章

  1. [JavaWeb-HTML]HTML标签(大部分常用标签介绍)
  2. [蓝桥杯2017初赛]方格分割-dfs+思维
  3. State(状态)--对象行为型模式
  4. N的阶乘的长度 V2(斯特林近似) 51Nod - 1130
  5. 基于matlab的数字下变频器的设计与仿真应用,基于MATLAB的数字下变频器的没汁与仿真应用...
  6. Java修炼之路——基础篇——枚举
  7. P4249 [WC2007]剪刀石头布(网络流/费用流)
  8. loj#2143. 「SHOI2017」组合数问题
  9. CF1592E Bored Bakry
  10. The 2019 ICPC Asia Shanghai Regional Contest