在java中可以有多个类加载器,默认有三个主要的类加载器,
BootStrap , ExtClassLoader , AppClassLoader
java中所有的类都由类加载器加载进内存,
类加载器本身也是java类,而类加载器是由BootStrp来加载
BootStrp不是java类,它是嵌在java虚拟机中的
所有的类加载器都采用具有父子关系的树形结构进行组织
在实例化一个类加载器对象时,需要为其指定一个父级类加载器
不指定,默认是系统加载器指定为其父级类加载器
每个类加载器都管辖一个范围
BootStrap 只在 jre/lib/rt.jar中找需要加载的类
ExtClassLoader 只在 jre/lib/ext中找需要加载的类
BootStrap 只在 classpath指定的目录中找需要加载的类
当java虚拟机在加载一个类时,首先会用当前线程的类加载器去加载线程中的第一个类
当类A中引用了类B,java虚拟机会用加载类A的类加载器去加载类B,如果没有找到类B,就会抛出ClassNotFoundException
还可以手动指定类加载器去加载某个类,ClassLoader.loadClass();
每个类加载器加载类时,又先委托给其父级类加载器
如果有父级类加载器,找到了这个类,直接用父级类加载器去加载
如果所有的父级类加载器都没有找到这个类,则回到发起者类加载器,
如果没有找到就会抛出ClassNotFoundException,而不会去让子级类加载器去找这个类
而自定义类加载器可以指定目录加载类,也可以在用的过程中把路径传进来,在类加载器内部处理传进来 的字符串,获取类名 |