1、启动类加载器:Bootstrap ClassLoader :加载对象是java核心库,把一些核心的类加载进jvm中,使用原生C/C++实现,所有类的加载器的父加载器。无法被java程序使用。
2、扩展类加载器:Extension ClassLoader:加载对象为java扩展库,由启动类加载器加载,getParent()返回null;
3、应用程序类加载器:Application ClassLoader:系统类加载器,加载用户类路径指定的类库,程序没有自定义加载器,为默认加载器。父类为扩展类加载器;
双亲委托机制:
一个类加载进来,委托给父类加载器加载,父类加载器又尝试委托给其父类加载器,以此类推,直到父类加载器为启动类加载器。父类加载器反馈无法加载时,子加载器才会尝试自己加载。
优点:
1、保证java应用所使用的都是同一个版本java核心库的类;
2、保证安全性,启动类加载器检查缓存中已经有加载的类,不会再次加载外部的类;
全盘负责机制:
一个类加载器加载一个类时,如果没有显式指定类加载器,该类所依赖的、引用的其他所有类都由这个类加载器加载;
jvm中,同一个jvm中可以有两个包名、类名都相同的类,只要他们由两个不同的类加载器加载。该特征提供了隔离机制,tomcat的hotswap机制;
报错ClassNotFoundException
原因:类加载器加载引用类时,只会向上查找引用类,而不会从子类加载器上查找;
解决方式:
1、用同一个类加载器;
2、a,b两个类,b类引用a类,a类加载器大于b类的加载器;