文档章节

ClassLoader加载Class的过程 解析

phacks
 phacks
发布于 2015/08/19 08:23
字数 792
阅读 49
收藏 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
Java类装载过程与类装载器

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

Hosee
2016/03/16
1K
0
Do You Really Know ClassLoader?

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

zqrferrari
2017/08/10
0
0
Android ClassLoader概述

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

黑暗世界的微光
2018/05/19
0
0
让类活起来——漫谈JVM类加载机制

所谓类加载机制,就是虚拟机把描述类的数据从Class文件加载到内存中,并对其进行校验,转换,分析以及初始化,并最终形成虚拟机可以被使用java类型的过程。 Java作为解释型语言,支持动态加载...

登高且赋
2018/01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在 Ubuntu 上为 CentOS 编译 Rust 程序

现在 CentOS 8 还没出来,最新的是 CentOS 7.6,上面搭载的 glibc 版本是 2.17,都已经是 2012 年那时候的版本了。 现在开发者比较常用的桌面 Linux 系统,比如 Ubuntu / Debian / Mint / A...

helloclia
29分钟前
8
0
Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

前言:从本篇开始,将进入Multimedia框架,包含MediaPlayer, Camera, Surface, MediaRecord, 接下来几篇都是MediaPlayer相关。同样看下Agenda如下: MediaPlayer的状态图 Idle 状态 End 状态...

天王盖地虎626
57分钟前
2
0
IntelliJ IDEA创建第一个Spring boot项目

下载maven:http://maven.apache.org/download.cgi 开发工具:IntelliJ IDEA JDK: Java JDK1.8 ## 1.为了第一个项目初始化速度加快,我们先来配置maven: 添加配置: 选择Build,Execution,Dep...

凌宇之蓝
今天
3
0
Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
今天
7
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部