一、什么是ClassLoader?
众所周知,当我们编写一个Java程序时,它是由几个程序组织的一个完整的Java应用程序。类文件。程序运行时,会调用程序的一个入口函数来调用系统的相关函数,而这些函数封装在不同的类文件中,所以我们经常需要从这个类文件中调用另一个类文件中的方法。如果另一个文件不存在,程序启动时,不会一次性加载程序使用的所有类文件,而是根据程序的需要通过Java的ClassLoader动态加载一个类文件到内存中,这样类文件加载到内存后才能被其他类引用。因此,ClassLoader用于将类文件动态加载到内存中。

二、其次,默认情况下,Java提供三个ClassLoader
BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中的顶层类加载器,负责加载JDK的核心类库,如rt.jar、resources.jar、charsets.jar等。

Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/下的所有jar。
App ClassLoader:称为系统类加载器,负责加载应用类路径目录下的所有jar和类文件。

注意:除了Java默认提供的三种ClassLoader,用户还可以根据需要定义自己的ClassLoader,这些自定义的ClassLoader必须继承java.lang.ClassLoader类。它还包括Java提供的另外两个ClassLoader(扩展ClassLoader和AppClassLoader),但是Bootstrap ClassLoader并不继承classloader,因为它不是一个普通的Java类,底层是C++编写的,已经嵌入到JVM内核中。当JVM启动时,引导ClassLoader会随之启动,并负责加载核心类库以及构建扩展ClassLoader和应用ClassLoaderClassLoader。

三、ClassLoader加载类的原理

1.原理介绍
类加载器使用父委托模型来搜索类。每个类加载器实例都有一个对父类加载器的引用(不是继承关系,而是包含关系)。虚拟机本身内置的引导类加载器没有父类加载器,但可以用作其他类加载器实例的父类加载器。当一个类加载器实例需要加载一个类时,它会将这个任务委托给它的父类加载器,然后再尝试亲自搜索一个类。这个过程从上到下检查。首先,顶层的引导类加载器试图加载它。如果它不加载它,它会将任务转移到扩展类加载器来尝试加载它。如果没有加载到,则转移到App ClassLoader进行加载,如果没有加载,则返回到委托的发起方,由发起方在指定的URL如文件系统或网络中加载类。如果它们都没有加载到该类中,则会引发ClassNotFoundException异常。否则,从找到的类中生成一个类定义,将其加载到内存中,最后在内存中返回该类的类实例对象。

2.为什么要用双亲委托的模式?
因为这样可以避免重复加载,所以当父类已经加载了类时,子类加载器就不需要再加载了。考虑到安全因素,让我们想象一下,如果不使用这种委托模式,我们可以随时用用户定义的String动态替换java核心api中定义的类型,这样会有很大的安全隐患。但是父委托的方式可以避免这种情况,因为String在启动的时候已经被Bootstrcp ClassLoader加载了。因此,用户定义的类加载器永远无法加载自己编写的字符串,除非您更改JDK的类加载器搜索类的默认算法。

一文了解类加载机制--ClassLoader相关推荐

  1. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  2. 一文读懂类加载机制 --- ClassLoader

    From:https://www.cnblogs.com/sunnick/p/9609326.html [JVM笔记]classloader加载class文件的原理和机制:https://www.ji ...

  3. Java类加载机制(ClassLoader)详解

    类加载机制总结 一.类加载器基本概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.ja ...

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

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

  5. android classloader异常,Android中ClassLoader类加载机制

    Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...

  6. 【深入理解JVM】ClassLoader类加载机制

    Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类.此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存.ClassLoader专门负责类文件 ...

  7. 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

    转载自 违反ClassLoader双亲委派机制三部曲第二部--Tomcat类加载机制 前言: 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上,进 ...

  8. JAVA类加载机制之Classloader以及打破加载机制的方式

    在jDK1.8中,Classloader加载class的字节码到JVM,它是遵循双亲委派模型的加载机制,主要是由BootstrapClassLoader,ExtClassLoader.AppClass ...

  9. 深入研究Java类加载机制

    深入研究Java类加载机制   类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载 ...

最新文章

  1. 用不惯VMware?试试这款更轻量级的虚拟机!
  2. 干货 | 2021年,深度学习还有哪些研究方向可以做?
  3. 特别的需要名言警句提醒一下自己
  4. Python sorted
  5. C#——语言基础 之 运算符!
  6. 【Obj-C】学习杂记-1
  7. 计算机风冷散热系统的原理,显卡“发烧”的原因_显卡散热原理
  8. python怎么将png转为tif_png转tif
  9. 【iVX 初级工程师培训教程 10篇文拿证】01 了解 iVX 完成新年贺卡
  10. 老师计算机传帮带工作总结,传帮带工作总结范文
  11. 前端学习(1431):ajax封装六
  12. spring 使用其他类protected方法_Java操作bean、属性、方法的使用工具类
  13. django 1.8 官方文档翻译:14-1 按需内容处理
  14. go新手看的开源项目 哪些适合_最近大家都在用 Go 语言玩什么?这几个新的开源项目告诉你...
  15. macOS 10.15安装GDB
  16. 卫星为什么在那么高的太空能看清地面?
  17. Spring框架中XML配置特殊属性注入
  18. 通过一个小Trick实现shader的像素识别/统计操作
  19. 一些会遗忘的代码属性
  20. Python(二):基本数据类型、序列的基本操作

热门文章

  1. 菜谱小程序源码免费分享【推荐】
  2. [集合]ConcurrentHashMap的源码分析
  3. Persistent Memory优化实践
  4. 如何测试病毒软件而且不中毒,不用外部工具 教你如何快速检查电脑是否被感染和中毒...
  5. iOS 播放器 或直播添加 弹幕
  6. 腾讯VIP会员最高涨50%,能否提价能否提出新天地?
  7. storage路径问题
  8. 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解
  9. Unsupported major.minor version 52.0(unable to load class com.xxxxxxx.xxx.xx.xx)
  10. Java基础 -> Java比C/C++执行慢的原因?