黑马程序员_19 类加载器


---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ------------


                              类加载器


类加载器基本概念:

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。
一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)
在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类
加载器负责读取 Java 字节代码,并转换成
java.lang.Class类的一个实例
。每个这样的实例用来表示一个 Java 类。通过此实例的
newInstance()
法就可以创建出该类的一个对象。

 类加载器层次图:


JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化

(Initialize)链接又分为三个步骤,如下图所示:


1:类加载器就是加载类的工具:
作用就是将.class文件的内容加载到硬盘中来,加载进以后再对它进行
一些处理。处理完后就是字节码。
2: Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,
每个类负责加载特定位置的类:
BootStrap,ExtClassLoader,AppClassLoader
3: 类加载器也是Java类,因为其他是java类的类加载器本身也要被类
加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。
4:Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,
在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或
者默认采用系统类装载器为其父级类加载。
5:类加载器的委托机制
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
6:每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,

则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因
为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输
出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。
7:每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以
委托其他的类装载器去加载类,这就是类加载器的委托模式。类装载器一级
级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,
然后才一级级回退到子孙类装载器去进行真正的加载。当回退到最初的类装
载器时,如果它自己也不能完成类的装载,那就应报告ClassNotFoundException
异常。
8:加载类的过程

在前面介绍类加载器的代理模式的时候,提到过类加载器会首先代理给
其它类加载器来尝试加载某个类。这就意味着真正完成类的加载工作的
类加载器和启动这个加载过程的类加载器,有可能不是同一个。真正完
成类的加载工作是通过调用
defineClass来实现的;而启动类的加载
过程是通过调用
loadClass来实现的。前者称为一个类的定义加载器
(defining loader),后者称为初始加载器(initiating loader)。在 Java
虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说
,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的
加载器。两种类加载器的关联之处在于:一个类的定义加载器是它引用的
其它类的初始加载器。如类
com.example.Outer引用了类
com.example.Inner,则由类com.example.Outer的定义加载器负
责启动类
com.example.Inner的加载过程。

方法 loadClass()抛出的是java.lang.ClassNotFoundException
异常;方法defineClass()抛出的是
java.lang.NoClassDefFoundError异常。

类加载器在成功加载某个类之后,会把得到的java.lang.Class类的

实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存
的类的实例,而不会尝试再次加载。也就是说,对于一个类加载器实例
来说,相同全名的类只加载一次,即
loadClass 方法不会被重复调用。



---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值