java中的类加载器总共分为4种,分别为启动类加载器(bootstraptClassLoader),扩展类加载器(ExtClassLoader),应用类加载器(AppClassLoder),自定义类加载器(CustomerClassLoader),
他们分别继承了ClassLoader类,这四个类的关系为,启动类加载器是继续C++实现的,他是顶级类加载器,扩展类加载器的父加载器为null,应为启动类的加载器是基于C++实现的,所以扩展类找不到对应的关系,应用类加载器的父加载器为扩展类加载器,所有的自定义类加载器的父加载器为应用类加载器,应为所有的类记载器都继承于ClassLoader。ClassLoader的默认类加载器就是应用类加载器。
双亲委派机制
首先加载一个类会从应用程序类加载器开始加载,应用类加载器会从自己已经加载的类中去查找,是否加载过此类,如果已经加载就直接返回该类,如果没有会委托自己的父加载器去加载,同样,父加载器也会在自己加载的类的集合中去查找是否加载过此类,如果有直接范围加载的类,如果没有,就会继续委托父加载器去加载,如果父加载器为空,就会委托启动类加载器去加载,,同样启动类加载器如果加载过此资源文件则直接返回该类,如果没有,就调用findClass方法去加载,但是启动类加载器所加载的资源都是jdk的lib目录的资源文件,如rt.jar等,如果需要加载的类不在此目录就会返回空,接着调用扩展类的findClass方法,去加载jdk下面的ext目录下面的jar文件,如果加载不到就返回空,接着调用应用类加载器的findClass方法,加载classPath路径下面的所有资源。加载到就返回此类的信息。