类加载器体系

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类的加载器;

你可能感兴趣的:(类加载器体系)