文档章节

ClassLoader加载Class的过程 解析

phacks
 phacks
发布于 2015/08/19 08:23
字数 792
阅读 47
收藏 1

ClassLoader即类加载器,负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象,当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构:bootstrap classloader ——> extension classloader ——> system classloader

bootstrap classloader:引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库:

[java] view plaincopy

  1. URL[] urls =sun.misc.Launcher.getBootstrapClassPath().getURLs();  

  2. for(int i = 0 , i < urls.length ; i++){  

  3. System.out.println(urls[i].toExternalForm());  

  4. }  


因为JVM在启动的时候就自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库

extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中的JAR包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。

extension classloader是system classloader的parent,而bootstrap classloader是extension classloader的parent,但 bootstrap classloader 不是一个实际的classloader。

system classloader - 系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。

可以通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。

classloader 加载类用的是全盘负责委托机制。

全盘负责:即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入

委托机制:先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。

l类加载还采用了cache机制:如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效的原因。

1. 检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2

2. 如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4

3. 请求parent classloader载入,如果成功到8,不成功到5

4. 请求jvm从bootstrap classloader中载入,如果成功到8

5. 寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.

6. 从文件中载入Class,到8.

7. 抛出ClassNotFoundException.

8. 返回Class.


© 著作权归作者所有

共有 人打赏支持
phacks
粉丝 6
博文 100
码字总数 105354
作品 0
高级程序员
私信 提问
Dalvik虚拟机中Java类的加载过程

  首先需要明白一点,Java类在使用之前必须先被加载。关于加载其实分为显式加载和隐式加载,显式加载就是我们通过自己来调用相应的加载方法来对特定的类进行加载,隐式加载就是在使用类的时...

酷客创意网
2017/12/27
0
0
Do You Really Know ClassLoader?

主要是对ClassLoader相关的知识进行一个总结,讨论和解决以下问题: Class和ClassLoader是什么关系,Class.forName 和ClassLoader.loadClass的联系与区别? new的过程是什么,在jvm中如何执行...

zqrferrari
2017/08/10
0
0
Java类装载过程与类装载器

class装载验证流程 1.1 加载 装载类的第一个阶段 通过类的全限定名取得类的二进制流 转为方法区数据结构 在Java堆中生成对应的java.lang.Class对象 1.2 链接 -> 验证 目的:保证Class流的格式...

Hosee
2016/03/16
1K
0
Android ClassLoader概述

(一) Android ClassLoader种类 1.BootClassLoader 主要加载AndroidFrameWork层的一些class字节码文件 2.PathClassLoader 用来加载已经安装在系统中的apk文件中的class文件 3.DexClassLoad...

黑暗世界的微光
05/19
0
0
Java反射在JVM的实现

1. 什么是Java反射,有什么用? 反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段。这使反射成...

umgsai
2016/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
10
0
ios多个target

1.建立3个target,分别为heroone,heroone test,heroone dev;分别为正式环境,test环境,dev环境 2.注意取消掉autocreate以防止名字不对,分别以Duplicate的方式建立另外两个scheme 3.创建...

HeroHY
今天
5
0
php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
昨天
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
昨天
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部