文档章节

类加载器的委托机制

凌枫yong
 凌枫yong
发布于 2016/07/17 13:42
字数 1018
阅读 1
收藏 0
与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。中文叫做类加载器。
Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。
Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。

一般类加载器的加载过程如下:
调用 findLoadedClass() 来查看是否存在已装入的类。
2>如果没有,那么获取class文件的原始字节。(通过IO从文件系统,来自网络的字节流等)
如果已有原始字节,调用 defineClass() 将它们转换成 Class 对象。
如果没有原始字节,然后调用 findSystemClass() 查看是否从本地文件系统获取类
如果 resolve 参数是 true,那么调用 resolveClass() 解析 Class 对象。
如果还没有类,返回 ClassNotFoundException。
否则,将类返回给调用程序。

类加载器之间的父子关系和管辖范围图

类加载器的委托机制
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
Ø首先当前线程的类加载器去加载线程中的第一个类。
Ø如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
Ø还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
Ø当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
Ø对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。

每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。类装载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类装载器去进行真正的加载。当回退到最初的类装载器时,如果它自己也不能完成类的装载,那就应报告ClassNotFoundException异常。

l有一道面试,能不能自己写个类叫java.lang.System,为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,也就是总是使用爸爸们能找到的类,这样总是使用java系统提供的System。
把先前编写的类加入到jdk的rt.jar中,会有怎样的效果呢?不行!!!看来是不能随意将自己的class文件加入进rt.jar文件中的。

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         //加载器:sun.misc.Launcher$AppClassLoader  
  4.         System.out.println(Test.class.getClassLoader().getClass().getName());  
  5.         //加载器:BootStrap(loader为null的情况)  
  6.         System.out.println(System.class.getClassLoader());//  
  7.         System.out.println("----------------查看类加载器的层次结构关系-------------------");  
  8.         ClassLoader loader = Test.class.getClassLoader();  
  9.         while(loader != null){  
  10.             System.out.println(loader.getClass().getName());  
  11.             loader = loader.getParent();  
  12.         }  
  13.         System.out.println(loader);  
  14.     }  
  15.     /** 
  16.      * 运行结果: 
  17.      *  sun.misc.Launcher$AppClassLoader 
  18.         null 
  19.         ----------------查看类加载器的层次结构关系------------------- 
  20.         sun.misc.Launcher$AppClassLoader 
  21.         sun.misc.Launcher$ExtClassLoader 
  22.         null 
  23.      */  
  24. }  

本文转载自:http://blog.csdn.net/u011990285/article/details/38084329

凌枫yong
粉丝 1
博文 65
码字总数 0
作品 0
南昌
私信 提问
Java基础巩固笔记(3)-类加载器

Contents java基础巩固笔记(3)-类加载器 默认类加载器 类加载器的委托机制 自定义类加载器的编写原理 参考资料 java类加载器就是在运行时在JVM中动态地加载所需的类,java类加载器基于三个机...

卟想苌亣
2017/12/04
0
0
Java类加载机制(二)

类加载器原理 将class文件字节码内容加载到内存中,并将这些静态数据转换为方法区的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据访问的入口 类缓存标准...

wjk_snail
2016/01/17
172
0
Java Classloader机制解析

做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结。因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspot Jvm. 本文将会从...

aminqiao
2014/05/09
24K
2
【随笔】JVM核心:JVM运行和类加载

前言 本篇博客将写一点关于JVM的东西,涉及JVM运行时数据区、类加载的过程、类加载器、ClassLoader、双亲委派机制、自定义类加载器等,这些都是博主自己的一点理解,如果有误,欢迎大家评论拍...

张丰哲
2017/10/29
0
0
加载器和双亲委派

一道面试题 能不能自己写个类叫java.lang.System? 答案:通常不可以,但可以采取另类方法达到这个需求。 解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸...

yan5845hao
2016/05/27
16
0

没有更多内容

加载失败,请刷新页面

加载更多

搭建高可用MongoDB集群(分片)

搭建高可用MongoDB集群(分片) MongoDB基础请参考:https://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:https://blog.51cto.com/kaliarch/2044618 一、概述 1.1 背景 ......

linjin200
18分钟前
4
0
CDH6.0.1集成tez-0.9.1计算引擎

参考文章: https://www.jianshu.com/p/9fb9f32e1f0f https://www.baidu.com/link?url=OgpwasnZi7H1dySN2T111sseEWDBaCCTC3DFV61G7756YbrkJCA8Y3UFaueyqnfN&wd=&eqid=daeb8b3500049cf3000000......

Sheav
20分钟前
4
0
Vue内置指令的使用

v-model(数据绑定) v-model常用于表单数据的双向绑定,它本质上是一个语法糖。它主要的有两种应用: 在文本框、多行文本、input的下拉框、单选按钮、复选框中的应用 <div id="app"> ...

凌兮洛
21分钟前
5
0
外部来源应用检查-烦死了,终于找到解决设置了

Android 连接usb调试应用的时候: 华为关闭方法:1、设置-安全-更多安全设置,关掉外部来源应用检查。2、设置-系统-开发人员选项-关闭“监控ADB安装应用” 不知道OPPO 怎么关闭的?...

QGlaunch
22分钟前
4
0
6个K8s日志系统建设中的典型问题,你遇到过几个?

作者 | 元乙 阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11、双 12 考验。 导读:随着 K8s 不断更新迭代,使...

阿里云官方博客
24分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部