Java类加载器解析

类加载器负责加载文件系统、网络或其他来源的类文件。即使类来源于同一个class文件,只要加载它们的类加载不同,则这两个类就必定不相等。

        绝大部分Java程序都会使用以下三种类加载器:Bootstrap类加载器、Extension类加载器和Application类加载器。

Bootstrap类加载器:

        它是所有类加载器的父加载器。Bootstrap类加载器没有任何父类加载器,Bootstrap加载器被称为初始类加载器。如果你调用String.class.getClassLoader(),会返回null。

Extension类加载器

        从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类。Extension加载器由sun.misc.Launcher$ExtClassLoader实现。

Application类加载器:

        它负责从classpath环境变量中加载某些应用相关的类,通过sun.misc.Launcher$AppClassLoader实现。一般情况下这个是程序中默认的类加载器。

在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器。

双亲委托模式:(避免重复加载)

        双亲委派模式要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,请注意双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来复用父类加载器的相关代码。

        其工作原理的是,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。

猜你喜欢

转载自blog.csdn.net/qq_27327855/article/details/80684641