我的博客地址:https://blog.csdn.net/qq_41907991

ClassLoader是一个经常出现又让很多人望而却步的词。本文试图以最浅显易懂的方式来讲解ClassLoader,希望不对该机制了解的朋友能起一点点作用。

首先来说,要了解ClassLoader,就要知道它是用来做什么的,顾名思义,他就是用来加载Class文件到JVM,已供程序使用的。我们指定,java程序可以动态加载类定义,而这个动态机制就是通过ClassLoader来实现的,所以,可想而知ClassLoder的重要性。

看到这里,可能有的朋友会问ClassLoader是用来加载类到JVM中去的,那么ClassLoader又是如何被加载的呢?难道它不是java的类?没错,这里确实有一个ClassLoader不是java语言所编写的,而是JVM实现的一部分,这个ClassLoader就是bootstrapclassloader(启动类加载器),这个ClassLoader在JVM运行的时候加载java核心API以满足java程序最基本的需求,其中就包括用户自定义的ClassLoader,这里所谓的用户自定义是指java程序编写的ClassLoader。

主要分为以下两个:一个是ExtClassLoader,另一个是AppClassLoader。ExtClassLoader是用来加载java的扩展API的,AppClassLoader是用来加载用户机器上CLASSPATH设置目录中的Class。通常在没有指定ClassLoader的情况下,程序自定义的类就由该ClassLoader进行加载。

当运行一个程序是,JVM启动,bootstrap ClassLoader 加载java的核心API(ExtClassLoader跟AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载用户的自定义类。这就是一个程序最基本的加载流程。

ClassLoader在加载类时,使用了双亲委托模式,下面对这种模式进行简单阐述。

每一个自定义的ClassLoader都必须继承ClassLoader这个抽象类,而每个ClassLoader都会由一个父类ClassLoader,我们可以看以下ClassLoader这个抽象类中由一个getParent()方法,注意,这个parent不是指的被继承的类,而是在实例化该ClassLoader时指定的一个ClassLoader,如果这个parent为null,那么就默认该ClassLoader的parent是bootstrapclassloader,这个parent有什么用呢?

我们可以考虑这种情况,假设我们自定义了一个ClassLoader,我们使用它去加载String类,那么这里的String是否会被我们自定义的ClassLoader加载呢?事实上并不会,而是由bootstrapclassloader进行加载,为什么会这样?实际上这就是双亲委托模式的原因,因为任何一个自定义的bootstrapclassloader在对类进行加载前,都会委托它的parenClassLoader进行加载,只有当parenClassLoade无法加载时,才会由自己加载。上面讲过,ClassLoade的parent为null时,ClassLoader的parent就是bootstrapclassloader,因此最终委托到bootstrapclassloader时,就是返回String的Class。

为什么要使用这种双亲委托模式呢?

1:避免重复加载,当父亲已经加载过该类的时候,就没有必要再加载一次了

2:考虑到安全因素,试想一下,如果不使用这种模式,我们可以随时的用自定的String来动态替代java核心API中定义类型,这样存在非常大的安全隐患

浅析java中ClassLoader如何加载Class的更多相关文章

  1. 通过源码浅析Java中的资源加载

    前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 理解类的工作原理 这一节主要分 ...

  2. java中的动态加载和热替换

    https://blog.csdn.net/u010833547/article/details/54312052 ****************************************** ...

  3. java中相对路径加载xml

    一.xml文件一般的存放位置有三个: 1.放在WEB-INF下: 2.xml文件放在/WEB-INF/classes目录下或classpath的jar包中: 3.放在与解析它的java类同一个包中,不 ...

  4. [Java类加载器]Java中classLoader浅析.

    本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.l ...

  5. Java中ClassLoader浅析.

    一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.lang; 2 3 public class Long { 4 public static void main(St ...

  6. 在Android的App中动态的加载Java类

    原文的地址:http://yenliangl.blogspot.com/2009/11/dynamic-loading-of-classes-in-your.html 我正在编写一个应用程序能够加载别 ...

  7. Java--自定义Class并且在内存中编译,加载,实例化

    本文的目的: 使用者在程序运行期间,可以动态的写Java Class,不需要生成任何.Class文件就可以完全在内存中编译,加载,实例化. 1.需要用到的组件介绍 1)JavaCompiler:用于编 ...

  8. 浅析Java中的反射机制原理

    反射反射,程序员的快乐! Java中反射机制使用的还是比较广泛的,系统的灵活性.可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能.但是很多人都只是会用,却是不知道它的 ...

  9. ClassLoader如何加载class?

    ClassLoader一个经常出现又让很多人望而却步的词,本文将试图以最浅显易懂的方式来讲解 ClassLoader,希望能对不了解该机制的朋友起到一点点作用. 要深入了解ClassLoader,首先 ...

随机推荐

  1. Java成长第三集--基础重点详细说明

    接上篇文章,继续阐述相关的重点基础知识,话不多说! 一.Java中equals()和“==”区别 1.对于8种基础数据类型,使用“=="比较值是否相等: 2.对于复合数据类型(类),使用eq ...

  2. Python程序设计实验报告三:分支结构程序设计

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  姚彩琴  学号3190505129 成绩 日期     2020.4.5     指导老师       修宇 [实验目的 ...

  3. async,await执行流看不懂?看完这篇以后再也不会了

    昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就 ...

  4. 记录在腾讯云上搭建Ubuntu服务器

    为了能让更多的比赛题复现,只好自己去手动搭建服务器 各种奇葩的操作以及很多的由于升级之后出现的问题变成了一个个坑. 写下这篇博客以此来记录我踩过的坑. 第一步 购买一个服务器,当然我购买的是学生版本的 ...

  5. MySQL之外键、主键、自增

    1.创建外键 create table userinfo( uid int auto_increment primary key, name varchar(32), department_id in ...

  6. py安装教程

    https://www.runoob.com/w3cnote/pycharm-windows-install.html

  7. C语言指定初始化器解析及其应用

    指定初始化器的概念 C90 标准要求初始化程序中的元素以固定的顺序出现,与要初始化的数组或结构体中的元素顺序相同.但是在新标准 C99 中,增加了一个新的特性:指定初始化器.利用该特性可以初始化指定的 ...

  8. 是时候学习python了

    “ 学习Pyhton,如何学以致用 -- 知识往问题靠,问题往知识靠” 01 为什么学Python 一直有听说Python神奇,总是想学,虽然不知道为啥.奈何每天写bug,修bug忙得不亦乐乎,总是不 ...

  9. PHP如何实现判断提交的是什么方式

    function get_request_method() { // $_SERVER包含了诸多头信息.路径.以及脚本位置等等信息的数组,这个数组中的项目有web服务器创建. if (isset($_ ...

  10. 递归复制&查看文件夹下的指定后缀的文件

    <?php header("content-type:text/html;charset=utf8"); set_time_limit(0); $dir = "d: ...