加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

JVM ClassLoader加载步骤

发布时间:2021-11-18 17:03:29 所属栏目:教程 来源:互联网
导读:JVM ClassLoader加载过程 1)三个类加载器: bootstrap classloader - 引导(也称为原始)类加载器,它负责加载Java的核心类。 extension classloader - 扩展类加载器,它负责加载JRE的扩展目录中JAR的类包。 system classloader - 系统(也称为应用)类加
JVM ClassLoader加载过程
 
1)三个类加载器:
 
bootstrap classloader - 引导(也称为原始)类加载器,它负责加载Java的核心类。
 
extension classloader - 扩展类加载器,它负责加载JRE的扩展目录中JAR的类包。
 
system classloader - 系统(也称为应用)类加载器,加载应用程序的类。
 
bootstrap classloader不是一个真正的ClassLoader实例
 
2)获取引导类加载器加载了哪些类:
 
URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
     for (int i = 0; i < urls.length; i++) {
         System.out.println(urls.toExternalForm());
     }
 
3)获取应用类加载器:
 
ClassLoader.getSystemClassLoader()
 
4)JVM类加载机制:全盘负责委托机制
 
全盘负责:当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;
委托机制:先让parent(父)类加载器(而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。
 
Cache机制:如果cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。
 
5)每个ClassLoader加载Class的过程是:
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.
其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读