JVM类加载器

JVM中有三个重要的类加载器

BootstrapClassLoader(启动类加载器):最顶层的类加载器,由C++实现,负责加载%JAVA_HOME%/lib目录下的jar包和类。
ExtensionClassLoader(扩展类加载器):主要负责加载%JAVA_HOME%lib/ext目录下的jar包和类。
AppClassLoader(应用程序类加载器):面向用户的类加载器,负责加载当前应用下Classpath下的所有jar包和类。

双亲委派模型

类加载之间的”父子“关系不是由继承来体现的,而是由”优先级“来体现的。
向上是为了检查类是否被加载,可以使类不会被重复加载。

在类加载的时候,系统首先会判断当前类是否被加载过,已经被加载的类会直接返回,否则才会尝试加载。加载的时候,首先会将请求委派给父类加载器的LoadClass()处理,因此所有类加载请求都会传到启动类加载器(BootStrapClassLoader),当父类加载器无法处理时,才由自己来处理,当父类加载器为NUll时,会使用启动类加载器(BootStrapClassLoader)作为父类加载器。
JVM类加载器

除了BootStrapClassLoader,其他类加载器均是由Java实现且全部继承自Java,lang.ClassLoader.
当我们不想用双亲委派模型的时候,可以自己定义一个类加载器,继承ClassLoader重写loadClass()即可。