我的博客地址: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. 弹幕有点逗比,用 Python 爬下来看看《民国奇探》的弹幕

    电视剧<民国奇探>是一部充斥着逗比风的探案剧,剧中主要角色:三土.四爷.白小姐,三土这个角色类似于<名侦探柯南>中的柯南但带有搞笑属性,四爷则类似于毛利小五郎但有大哥范且武功高 ...

  2. PrestoSPI安全扩展

    由于Presto官方文档和谷歌搜索都没有相关的内容,git项目中也没有支持sentry的安全插件扩展,因此只能从源码中寻找答案,在梳理完SPI包的安全相关源码结构后,已实现了一个自定义的安全插件,经验 ...

  3. Django系列操作

    每次用到都去百度找....找的还不行~~得自己改~~耗时耗力虽然不难~~~直接贴代码记录下方便自己用~~~~ Django之分页 定义成一个块,直接引用到对应的位置即可... <div clas ...

  4. JavaScript基础笔记1220

    JavaScript笔记1.JavaScript关键词2.JavaScript标识符 必须以字母,下划线(_)或美元符($)开始. 后续的字符可以是字母.数字.下划线或者美元符 (数字是不允许作为首字 ...

  5. for嵌套setTimeout的心得

    export default { data() { return { dialogList: [] } }, created() { this.setList() }, methods: { setL ...

  6. Jmeter系列(7)- 基础线程组Thread Group

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html Thread Group基础线程组介绍 ...

  7. 随笔之——浮动(float)的影响及其清除、、clear与overflow-hidden清除float的不同!!!

    一.浮动(float)对内联元素的影响. 1.我们都知道,内联元素(例如:span/img/input...)在正常情况下不可以对其设置宽高的,它的大小之只和它内部内容的多少有关. 我们怎样才可以对其 ...

  8. LeetCode 面试题56 - I. 数组中数字出现的次数 | Python

    面试题56 - I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). ...

  9. thinkphp5 csv格式导入导出(多数据处理)

    关于csv文件格式的导出导入个人见解 先上代码: <?php namespace think; class Csv { /** * 导出csv文件 * @param $list 数据源 * @p ...

  10. phpcms 用phpexcel导入导出excel

    html <form method="post" action="?m=content&c=content&a=public_add_excel&q ...