浅析java中ClassLoader如何加载Class
我的博客地址: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的更多相关文章
- 通过源码浅析Java中的资源加载
前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 理解类的工作原理 这一节主要分 ...
- java中的动态加载和热替换
https://blog.csdn.net/u010833547/article/details/54312052 ****************************************** ...
- java中相对路径加载xml
一.xml文件一般的存放位置有三个: 1.放在WEB-INF下: 2.xml文件放在/WEB-INF/classes目录下或classpath的jar包中: 3.放在与解析它的java类同一个包中,不 ...
- [Java类加载器]Java中classLoader浅析.
本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.l ...
- Java中ClassLoader浅析.
一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.lang; 2 3 public class Long { 4 public static void main(St ...
- 在Android的App中动态的加载Java类
原文的地址:http://yenliangl.blogspot.com/2009/11/dynamic-loading-of-classes-in-your.html 我正在编写一个应用程序能够加载别 ...
- Java--自定义Class并且在内存中编译,加载,实例化
本文的目的: 使用者在程序运行期间,可以动态的写Java Class,不需要生成任何.Class文件就可以完全在内存中编译,加载,实例化. 1.需要用到的组件介绍 1)JavaCompiler:用于编 ...
- 浅析Java中的反射机制原理
反射反射,程序员的快乐! Java中反射机制使用的还是比较广泛的,系统的灵活性.可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能.但是很多人都只是会用,却是不知道它的 ...
- ClassLoader如何加载class?
ClassLoader一个经常出现又让很多人望而却步的词,本文将试图以最浅显易懂的方式来讲解 ClassLoader,希望能对不了解该机制的朋友起到一点点作用. 要深入了解ClassLoader,首先 ...
随机推荐
- 理解SVG的缩放 偏移的计算公式
SVG中DOM元素的偏移与缩放都是基于SVG元素的左上角,所以如何理解与计算SVG中元素的真实位置就比较难,下面的例子都以圆(circle)为例. 1.缩放假定缩放的比例为s,执行缩放后,圆的圆心坐标 ...
- 百度AI开发平台简介
AIstudio https://aistudio.baidu.com/aistudio/index 关于AI Studio AI Studio是基于百度深度学习平台飞桨的一站式AI开发平台,提供在线 ...
- J - The sum problem
Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the sum ...
- vue2.x学习笔记(八)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12577433.html. 列表渲染 vue提供了一个[v-for]指令用于列表渲染(循环). 用[v-for]指令 ...
- 【错误】python百分号冲突not enough arguments for format string
query = "SELECT * FROM devices WHERE devices.`id` LIKE '%{}%'".format("f2333") d ...
- powershell提示无法将“”项识别
解决: 完成! 解释: 权限问题.Powershell脚本的4种执行权限介绍,Windows默认不允许任何脚本运行,我们可以使用"Set-ExecutionPolicy"cmdle ...
- 十分钟搞懂Elasticsearch数字搜索原理
更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森 前言 Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对于字段类型是 ...
- debian7安装了mysql后,局域网去连接时出现10061错误
- Redis来限制用户 ------------IP某个时间段内访问的次数
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); //获取客户端真实ip地址 function get_real_ip(){ s ...
- Linux系统管理第五次作业 LVM逻辑卷 磁盘配额
1.为主机增加80G SCSI 接口硬盘 2.划分三个各20G的主分区 [root@localhost ~]# fdisk /dev/sdf 欢迎使用 fdisk (util-linux 2.23.2 ...