类加载器
每个类都有一个加载器来进行加载的。
加载器也是一个类,也需要一个加载器来加载这个加载器的类。
所以,最一开始有一个加载器,是用来加载其他加载器的顶级加载器。这个加载器叫:Bootstrap。
加载器也分不同管辖范围,Bootstrap是最顶级的加载器,他下面还有一个加载器,叫:ExtClassLoader。他是Bootstrap的子类。
ExtClassLoader下面也有个子类加载器,叫AppClassLoader。他是ExtClassLoader的子类加载器。
这三个加载器管理的类也不同,分别以不同文件夹来区分。
如下图
运行原理(委托机制):
上图三个加载器分别对应三个不同的路径地址,每个加载器都从自己的路径下找类文件来加载。
当系统需要对类进行加载时,是有一个规则的。这个规则就是以上图三个主要加载器的关系来进行的。
如果需要加载一个类,系统会先从Bootstrap开始。如果Bootstrap对应的那个文件夹下有这个类文件。那么久直接加载了。
如果Bootstrap没有。交给ExtClassLoader。如果ExtClassLoader没有。再交给AppClassLoader。
一般咱们新建的类,都是在AppClassLoader这个加载器路径下存储的,所以都用AppClassLoader这个加载器。
那么,当有人问你,你可以新建一个System类么。答案是不行的。因为System在最顶级的Bootstrap加载器的路径中已经有了,按照原则,从上到下,系统会使用Bootstrap直接进行加载,所以你写了以后,也不会被加载,加载的还是在Bootstrap目录下的system类。
但是,你可以自己做一个加载器来加载System类。如果有必要的话。
这就是加载器的委托机制。
补充:
当你有个类叫A,A类里面引用了类B,那么B类的加载器延用A类的加载器。
同时,可以调用ClassLoader.loadClass()方法来指定某个加载器去加载某个类。