Java类加载机制:双亲委托模型

前言(废话)

一如既往,这篇博客是我极为浅显的理解,仅仅是我记录我自己成长的一环而已。我以前听我老师说过,什么是进步,进步就是当你三个月后重新再看自己的代码,发现那就是垃圾。

如果不是这样,那么就意味着你在三个月中其实毫无进步!


思维导图


类加载器分类

基本和现代计算机操作系统的内存区分用户区和系统区的思路一致。将加载类的操作区分为加载系统类BootstrapClassLoader以及系统类的扩展库ExtClassLoader,以及运行应用时的加载应用自带类AppClassLoader以及用户系统对应用进行扩展的用户自定义类加载器CustomClassLoader

BootstrapClassLoader(启动类加载器)

c++编写,加载java核心库 java.*,构造ExtClassLoaderAppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作

ExtClassLoader(标准扩展类加载器)

java编写,加载扩展库,如classpath中的jrejavax.*或者
java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。

AppClassLoader(系统类加载器)

java编写,加载程序所在的目录,如user.dir所在的位置的class

CustomClassLoader(用户自定义类加载器)

java编写,用户自定义的类加载器,可加载指定路径的class文件

双亲委托机制

这个名词看起来很高大上,其实实际上并没有特别多的内涵。什么是双亲委托机制?就是对于一个类加载器,我并不信任你,所以每当一个类加载器去加载类时,都会按照以下流程进行,转述官方代码文档:

  1. Invoke {@link #findLoadedClass(String)} to check if the class has already been loaded.调用findLoadedClass(String)方法来查看类是否已经被加载了
  2. Invoke the {@link #loadClass(String) <tt>loadClass</tt>} method on the parent class loader. If the parent is <tt>null</tt> the class loader built-in to the virtual machine is used, instead.调用双亲类loadClass(String)方法来查看是否双亲类加载其已经加载了该类,如果已经加载,直接使用。 但是实际上我们可以看到对于没有双亲的类加载器,则会检查启动类加载器是否加载过该类。
  3. Invoke the {@link #findClass(String)} method to find the class.调用自身findClass(String)方法来加载类。

源码分析

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loaded//首先检查当前类加载器是否加载过该类Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {//如果有双亲类加载器,尝试让双亲加载if (parent != null) {c = parent.loadClass(name, false);}//如果没有类加载器,则通过启动类加载器来加载该类else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}//如果还是没有找到,那么只能用当前类加载器来加载对应类if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statsPerfCounter.getParentDelegationTime().addTime(t1 - t0);PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

必要性

避免类的重复载入

对于计算机来说,资源永远是缺乏的,通过双亲委托模型的方式,能很好地避免对于相同类的重复加载。

避免核心类被篡改

如果不是通过双亲的优先级永远高于当前类加载器,那么我们完全可以让一个自定义类加载器去加载对于虚拟机来说核心的的一些类,并对其行为和活动进行一些篡改。这就会让虚拟机本身运行在一个极为不确定,不安全的环境下。


参考

于当前类加载器,那么我们完全可以让一个自定义类加载器去加载对于虚拟机来说核心的的一些类,并对其行为和活动进行一些篡改。这就会让虚拟机本身运行在一个极为不确定,不安全的环境下。


参考

  • 面试官:java双亲委派机制及作用

Java类加载机制:双亲委托模型相关推荐

  1. Java类加载机制双亲委派机制

    关键知识点提炼: 类的唯一性:类的实例= 类加载器 ➕全限定类名 (扩展pandora容器隔离原理-类加载器隔离) 类加载过程:家(加)宴(验)准备了西(析)式菜. 加载-验证-准备-解析-初始化 双 ...

  2. 面向对象回顾(静态变量、类加载机制/双亲委派模型、Object类的方法、类和对象区别)

    1. 静态变量存在什么位置? 方法区 2. 类加载机制,双亲委派模型,好处是什么? 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务, ...

  3. java类加载和双亲委派模型浅说

    本文目录 前言 一.类加载器 1.1 类加载机制的基本特征 1.2 类加载的分类 1.3 类加载器 A.启动类加载器(引导类加载器,Bootstrap ClassLoader) B.扩展类加载器(Ex ...

  4. 由源码深入Java类加载器(双亲委派模型)

    JVM类加载器 JVM主要有以下几种类加载器: 引导类加载器 主要加载JVM运行核心类库,位于JRE的lib目录下,如rt.jar中的类. 扩展类加载器 主要加载JVM中扩展类,位于JRE的ext目录 ...

  5. 看完吊打面试官!java类加载机制双亲委派

    前言 周末花了2天时间学习了额RabbitMQ,总结了最核心的知识点,带大家快速掌握RabbitMQ,整理不易希望帮忙点赞,转发,分享下,谢谢 阿里的人才画像 其实最近两年自己一直在做面试官,也面试过 ...

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

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

  7. 类加载器双亲委托机制详解

    理论了解: 关于类加载器的双亲委托机制基本上都听说过,面试时可能偶尔也会被问到,但是可能都是网上去找了一个理论性的答案临时了解了一下,并未对它到底是个什么样的机制有深入的了解,所以接下来准备深入了解它 ...

  8. Java——类加载机制

    ** 一.什么是类的加载 ** 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区 ...

  9. Java高级篇——深入浅出Java类加载机制

    转载自 Java高级篇--深入浅出Java类加载机制 类加载器 简单讲,类加载器ClassLoader的功能就是负责将class文件加载到jvm内存. 类加载器分类 从虚拟机层面讲分为两大类型的类加载 ...

最新文章

  1. MySQL最新版8.0.21安装配置教程~
  2. Idea运行web项目时,提示java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方法
  3. python【力扣LeetCode算法题库】面试题 10.01-合并排序的数组
  4. 怎样学好python-零基础如何学好Python?
  5. PyQt - 维基百科,自由的百科全书
  6. python字符串类型str_python数据类型之字符串类型str
  7. matlab imhist灰度直方图
  8. 吴恩达机器学习课程笔记章节二单变量线性回归
  9. 电机入门之路系列1--减速步进电机的原理
  10. 就像教育一样,本身作用巨大,当过度强化,就是扭曲了~
  11. 重磅发布!36氪2020年度中国最具登陆科创板潜力企业TOP50榜单揭晓
  12. 庄河投资10亿元强力打造“智慧城市”
  13. JQ简单二级导航,加子导航栏
  14. 【渝粤教育】广东开放大学 财会法规和职业道德 形成性考核 (26)
  15. 告诉你一个真实的数字化
  16. C# 汉字转拼音(支持GB2312字符集中所有汉字)
  17. python导入excel加入折线图_excel表格中怎么设计炫酷折线图
  18. 推荐系统-基于用户的推荐在社交网络中的应用
  19. android 名片识别软件,手机名片识别工具Android名片全能王评测
  20. ide模式ahci模式_IDE的完整形式是什么?

热门文章

  1. vscode+eslint自动格式化vue代码的方法
  2. php如何隐藏入口文件,PHP怎样隐藏入口文件
  3. php SQLite mysql_PHP实现的sqlite数据库连接类
  4. vb.net 线程偶尔不会自动关闭_C# 多线程系列(7)手动线程通知
  5. python web页面输出_python+socket+jq实现web页面实时输出结果
  6. sas数据集怎么导出_PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击!...
  7. linux定时任务配置失效,linux下定时任务和延迟任务
  8. 我的职业发展目标计算机作文,作文《我的职业发展目标》1000字
  9. linux hrtimer 绑定cpu,Linux hrtimer分析--未配置高精度模式
  10. 方差分析 球形检验_重复测量数据的方差分析