------- android培训、java培训、期待与您交流! ----------
简要介绍什么是类加载器和类加载器的作用
Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。它是嵌套在java虚拟机内核里面的,Java虚拟机内核一启动,它就在里面了,它是用c++编写的。
Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
Class类中的方法:
ClassLoader类中的方法:
package cn.itcast.day2;
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println(
ClassLoaderTest.class.getClassLoader()
.getClass().getName());//sun.misc.Launcher$AppClassLoader
System.out.println(
System.class.getClassLoader() ); //null,不代表没有类加载器,而代表它是一个特殊的类加载器BootStrap。
//以下代码,验证 类加载器 的父子关系。
ClassLoader loader = ClassLoaderTest.class.getClassLoader();//AppClassLoader
while(loader!=null) {
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
}
}
类加载器 的 父子关系,运行结果:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null (代表:BootStrap)
类加载器之间的父子关系和管辖范围图:
![](https://img-blog.csdn.net/20140411210633203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWVsaW5kYTIzMDk2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我们将刚才写的那个类,右键 Export (以java的 jar 包的格式)导出到 jre/lib/ext/*.jar 文件夹下。
再运行程序,该类的类加载器变成了 ExtClassLoader。
此时的环境状态是classpath目录有ClassLoaderTest.class,ext/itcast.jar包中也有ClassLoaderTest.class,
为什么由爸爸(ExtClassLoader)加载了,而没有被儿子(AppClassLoader)加载,这时候我们就需要了解类加载的具体过程和原理了。
类加载器的委托机制