1.简介

Classloader的核心作用就是将编译之后的class文件加载到jvm运行的内存当中。在jvm的规范当中,类加载器主要分为三种:引导类加载器(BootClassLoader)、扩展类加载器(ExtClassLoader)、系统类加载器(AppClassLoader)。

2.加载器分类

2.1 引导类加载器

引导类加载器主要加载的class是jdk本身的类库(JAVA_HOME\lib目录下的jar文件),这些类库都是jdk核心的类库(rt.jar),也是最重要的,因此由这个加载器去完成加载和初始化。并且这个加载器是使用C语言实现的。

2.2扩展类加载器

扩展类加载器的主要作用就是加载jdk的扩展包jar文件(JAVA_HOME\lib\ext目录下的jar文件),这些文件是JDK的扩展类库。

2.3 系统类加载器

系统类加载器的核心作用就是加载classpath路径下的class文件以及jar文件,这些类库通常由开发人员自己编写的,因此这些类都是通过系统类加载完成加载。

3.委托模式

在执行类加载的时候,最先由系统类加载器开始,但它会把加载的执行权先交给扩展类加载器,同样,扩展类加载器也会将加载的执行权交给引导类加载器,最终由引导类加载器开始加载,如果需要加载的类库不是引导类加载器加载的范畴,那么就会将加载权交回给扩展类加载器。同样,如果类库不是扩展类加载器加载的范畴,最后就交由给系统类加载器来完成,这个过程就是委托。这样做的目的是为了保证系统类库加载时的安全性,如:Object、String类等等,这些都应该由引导类加载器来完成,不应该交由其他加载器,因为,如果这些类库加载后可以由用户来进行操作,那么就可能会导致类的不安全。例如:用户可以重载或修改类中的方法,这是绝对禁止的。

4.ClassLoader的常见API

除了引导类加载器是有C语言来实现以外,其他的类加载器都是集成自ClassLoader这个类,而这个类中提供了相应的加载API来完成类加载以及初解析和初始化的过程。

08-22 07:48