提到 Class 的加载,就不得不提到 ClassLoader,因为 java 加载类就是靠它加载的,它负责读取字节码的字节流进行加载。
ClassLoader 的继承关系是从 BootStrapClassLoader 开始的,也是由它最先加载类,然后是 ExtClassLoader,接下来是 AppClassLoder(应用程序默认的),
最后是用户自己的 ClassLoader(通常在容器下编写代码,都是由容器自定义创建的 ClassLoader 创建的类)。下面简单介绍一下他们的用途。
BootStrapClassLoder 主要用于加载一些 java 自带的核心类 (例如 java.lang.*), 通常这些核心类的 Class 被签名,不能被替换掉,它是由 JVM 内核实现的,
在 Hotspot VM 中用 C++ 实现的,有了它加载最核心的内容,才会有后面的 ClassLoader 的存在。
ExtClassLoader 是加载在 jre/lib/ext / 目录下的 jar 包,用户也可以自己将 jar 包放到这个目录下,通过这个 ClassLoader 来加载。
AppClassLoader 也是用户可见的 ClassLoader,它加载的是 classpath 下面的内容,也就是和 classpath 相关的类,在默认情况下都由它来加载。
用户自定义的 ClassLoader 要加载的内容可能不在系统的 classpath 范围内(也可以在这个范围内),甚至不是 Class 文件或 jar 文件,
也就是加载方式可以完全由自己来定义。
来源: http://www.bubuko.com/infodetail-2438770.html