博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ClassLoader加载Class的过程 解析
阅读量:7010 次
发布时间:2019-06-28

本文共 1791 字,大约阅读时间需要 5 分钟。

  hot3.png

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

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

[java] 

  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.

转载于:https://my.oschina.net/phacks/blog/494261

你可能感兴趣的文章
不错的在线印章生成器网站
查看>>
Arduino控制LCD显示helloworld
查看>>
线程、任务和同步学习笔记(一)
查看>>
JavaScript this
查看>>
OpenJudge/Poj 1163 The Triangle
查看>>
POJ 3130 半平面交+模版改进
查看>>
Python基础二
查看>>
AndroidStudio -- AndroidStuido中找不到cache.properties文件
查看>>
nginx 无法访问root权限的文件内容
查看>>
进程和线程有什么区别?
查看>>
关于text-align无法居中的问题
查看>>
Here We Go(relians) Again
查看>>
Signal函数
查看>>
[Errno 14] PYCURL ERROR 7 - "couldn't connect to host"
查看>>
chrono
查看>>
hdu2586 lca模板(在线路径倍增)
查看>>
AscII表
查看>>
BASE64图片转字符串
查看>>
springboot-国际化
查看>>
C11中替代gets()的函数
查看>>