- Bootstrap ClassLoader
- 加载$JAVA_HOME中jre/lib/rt.jar 里所有的class或Xbootclassoath选项指定的jar包
- Extension ClassLoader
- 加载java平台中扩展功能的一些jar包、包括$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar
- App ClassLoader
- 加载classpath中指定的jar包及-Djava.class.path所指定的目录下的类和jar包
- Custom ClassLoader
- 通过java.lang.ClassLoader的子类自定义加载class 属于应用程序根据自身需要自定义的ClassLoader 如tomcat 、jboss都会根据j2ee 规范自行实现ClassLoader
相对于类加载的其他阶段而言,加载阶段(准确地说,是加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。
双亲委派
定义:如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把
这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就
成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
优势:Java类随着加载它的类加载器一起具备了一种带有优先级的层次关系。比如,Java中的
Object类,它存放在rt.jar之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型
最顶端的启动类加载器进行加载,因此Object在各种类加载环境中都是同一个类。如果不采用
双亲委派模型,那么由各个类加载器自己取加载的话,那么系统中会存在多种不同的Object
类。