ClassLoader

java只有在需要的时候才会将类加载进来,而类的加载就是所谓的类加载器来完成的
通常情况下,程序启动之后,会用到三个类加载器:BootstrapLoader,ExtClassLoader,
AppClassLoader.这三者的作用相同,都是加载类到虚拟机中,但是分工不同:
1.BootstrapLoader负责搜索环境变量sun.boot.calss.path指定目录,也就是JRE所在
目录下的classes目录或者lib目录下的jar文件,并且将指定的类加载到虚拟机
2.ExtClassLoader负责搜索环境变量java.ext.dirs指定目录,也就是JRE所在目录的
lib/ext目录下的classes目录或者jar文件,并将指定的类加载到虚拟机
3AppClassLoader则搜索环境变量java.class.path指定的目录,也就是我们在环境变量中
配置的Class_Path目录的类或者jar文件,并且将指定的类加载到虚拟机

当虚拟机启动的时候,将会载入BootstrapLoader,这是一个由C++编写的类,然后它会将
ExtClassLoader加载进来,并且将ExtClassLoader的父类加载器设为它自己,然后
BootstrapLoader将AppClassLoader加载进来,并且将AppClassLoader的父类加载器设
为ExtClassLoader
(注意:除了BootstrapLoader外,其他的加载器的父类加载器和负责将加载器加载进来
的加载器之间,没有必然的联系,例如:ExtClassLoader和AppClassLoader都是由
BootstrapLoader加载的,但是AppClassLoader的父类加载器是ExtClassLoader,而不是
BootstrapLoader)

在java的类加载器中,存在一种委托关系:当类加载器需要加载一个类的时候,会首先
委托它的父类加载器从其搜索路径中搜索相关类,如果找到,则加载父类加载器所找到
的类,否则,才从自身的搜索路径中寻找相关的类,如果还是找不到,则抛出一个
NoClassDefFoundError异常,在这里的类加载器的委托时递归的,它将一层层的往上委
托,直到BootstrapLoader

你可能感兴趣的:(虚拟机,ext,sun)