什么是类加载器
类加载器就是加载类的工具,我们在程序中用到一个类的时候,虚拟机通过类加载器将
class文件加载加载到内存中在进行一系列的处理后变成字节码为我们使用。
Java
中默认的类加载器
Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:
BootStrap,
ExtClassLoader,
AppClassLoader
类加载器也是
java类,因为其他
java类加载器本身也要被类加载器加载,显然必须有一个类加载器不是
java类,这就是
BootStrap。
代码示例:查看个各类的加载器
package cn.itcast.classloader;
/**
* 测试类加载器的类
*
@author
hezhudong
*
*/
public
class ClassLoaderTest {
/**
*
@param args
*/
public
static
void main(String[] args) {
//
TODO Auto-generated method stub
//获取ClassLoaderTest类的加载器名称并打印
String classLoaderName = ClassLoaderTest.
class.getClassLoader().getClass().getName();
System.
out.println(classLoaderName);
//获取System类的加载器并打印
ClassLoader classLoader2 = System.
class.getClassLoader();
System.
out.println(classLoader2);
//获取classLoaderTest类的加载器以及加载器的父加载器
ClassLoader loader = ClassLoaderTest.
class.getClassLoader();
while(
loader!=
null) {
System.
out.println(
loader.getClass().getName());
loader = loader.getParent();
}
System.
out.println(
loader);
}
}
类加载器的委托机制
Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织如下图,在实例化每个类加载器对象时,需要为其指定一个父级加载器对象或默认采用系统加载器为其父类加载。
当
java虚拟机要加载一个类时,到底由哪个类加载器加载呢?
1. 首先当前线程的类加载器去加载线程中的第一个类。
2. 如果
A类中引用了
B类,
java虚拟机将使用加载
A类的加载器来加载
B类
3. 还可以直接调用
ClassLoader.loadClass()方法来指定某个类加载器去加载某个类
每个类加载器在加载类时,又先委托给其上级类加载器。
1. 当所有上级类加载器没有加载到类时,回到发起者类加载器,还没有加载到类会抛出
ClassNotFoundException,不会在找发起者类加载器的下级加载器,因为没有
getChild方法,即使有,那有多个儿子,该去找哪一个?
2. 对类加载器的层次结构图和委托加载器原理,解释先前将
ClassLoaderTest输出到
jre/lib/ext目录下的
itcast.jar包中后,运行结果为
ExtClassLoader的原因。