宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

1、引导类加载

引导类加载器(Boostrap ClassLoader),又叫启动类加载器。由C/C++语言实现,嵌套在JVM内部。用来加载 Java 的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类。并不继承自 java.lang.ClassLoader,没有父加载器。是扩展类加载器和应用类加载器的父类加载器。出于安全考虑,Boostrap类加载器只加载包为java、javax、sun等开头的类。

引导类加载器是jvm在运行时,内嵌在jvm中的一段特殊的用来加载java核心类库的C++代码。String.class 对象就是由引导类加载器加载的,引导类加载器具体加载哪些核心代码可以通过获取值为 “sun.boot.class.path” 的系统属性获得。引导类加载器不是java原生代码编写的,所以其也不是java.lang.ClassLoader类的实例,其没有getParent方法。

2、拓展类加载器

扩展类加载器(Extension ClassLoader),Java语言编写,由sun.misc.Launcher类的内部类ExtClassLoader类实现,派生于ClassLoader类,父加载器为引导类加载器。从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的jar包放在此目录下,也会自动由扩展类加载器加载。

拓展类加载器用来加载jvm实现的一个拓展目录,该目录下的所有java类都由此类加载器加载。此路径可以通过获取”java.ext.dirs”的系统属性获得。拓展类加载器就是java.lang.ClassLoader类的一个实例,其getParent方法返回的是引导类加载器(在 HotSpot虚拟机中用null表示引导类加载)。

3、系统类加载器

系统类加载器(System ClassLoader),也称为应用程序类加载器。根据 Java应用程序的类路径(java.class.path或CLASSPATH环境变量)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。该类由sun.misc.Launcher$AppClassLoader实现。

开发者可用通过 java.lang.ClassLoader.getSystemClassLoader()方法获得此类加载器的实例,系统类加载器也因此得名。其主要负责加载程序开发者自己编写的java类。一般来说,java应用都是用此类加载器完成加载的,可以通过获取”java.class.path”的系统属性(也就是我们常说的classpath)来获取应用类加载器加载的类路径。应用类加载器是java.lang.ClassLoader类的一个实例,其getParent方法返回的是拓展类加载器。

4、用户自定义类加载器

用户自定义类加载器(User-Defined ClassLoader),ClassLoader子类。

用户自定义类加载器实现:

  • 开发人员通过继承抽象类java.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊需求。
  • 不建议覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在findCalss()方法中。
  • 在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLClassLoader类,这样可以避免自己去编写findClass()方法以及获取字节码流的方式,使自定义类加载器编写更加简洁。