双亲委派机制的优点: 同样的类不会被重复加载。
一、概述:
类加载器:类加载器用于加载 .class字节码文件到内存中(并为每个 .class字节码文件生成 Class对象)。
二、四种类加载器介绍:
2.1.启动类加载器(Bootstrap ClassLoader): 用于加载jdk的核心类类库中的类,具体加载( jdk/jre/lib
) jdk目录/jre子目录/lib子目录中的类(java官方类库)
、或sun.
boot.class.path属性指定的
路径下的类(了解即可)。 还可以加载扩展类加载器 和 应用程序类加载器。 但通常处于安全性考虑只允许其加载 java、sun、javax包及子包下的类(比如 java.lang.Math, java.lang.String)。
2.2.扩展类加载器 Extension ClassLoader:
用于加载: Java 语言编写,由 sun.misc.Launcher$ExtClassLoader实现。其继承了 java.lang.ClassLoader抽象类。 父加载器为启动类加载器(Bootstrap ClassLoader)。
用于加载Java的扩展类库, jdk
/jre/lib/ext目录中的 JAR 压缩文件和类。
2.3.应用程序类加载器 ApplicationClassLoader:
Java 语言编写,由 sun.misc.Launcher$AppClassLoader 实现。其继承了 java.lang.ClassLoader抽象类。 父加载器为扩展类加载器。用于加载:自己编写的类、第三方库提供的类、一些其他的资源文件。是java开发的应用程序默认的类加载器,一般来说,Java 开发的应用程序中的类都是由它来完成加载。
注意:应用程序类加载器 ApplicationClassLoader也叫做系统类加载器, 因为是项目默认的类加载器。
2.4.自定义类加载器:
日常开发中,上述3种类加载器相互配合就几乎可以加载所有的类及相关资源。 但必要时,可以自定义类加载器,来定制类的加载方式。
注意: 如果一个项目中用户没有创建并启动自定义类加载器,则本项目中就不涉及用户自定义类加载器
public class CustomClassLoader extends ClassLoader {
//省略类自定义加载器的其他具体实现代码。
public static void main(String[] args) {
try {