类的加载器

A class loader is an object that is responsible for loading classes.
类加载器的主要作用就是加载Java类的字节码(class文件)到 JVM 中(在内存中生成一个该类的Class对象)
Every Class object contains a reference to the ClassLoader that defined it.

# JDK8
(无法直接访问)Bootstrap ClassLoader: 只负责加载JAVA_HOME/jre/lib下的类
(上级为Bootstrap)Extension ClassLoader: 只负责加载JAVA_HOME/jre/lib/ext下的类
(上级为Extension)AppClassLoader: 加载classpath下的类
(上级为Application)自定义类加载器: 自定义
#
默认创建的类都是由jdk.internal.loader.ClassLoaders$AppClassLoader来加载的
对于一个类加载器来说,相同二进制名称的类只会被加载一次
#
类加载的时候,先判断自己是否已经加载过,已加载过就会直接返回
自己没加载过,先委托给上级处理,上级处理不了(如 加载时找不到这个类或者ClassNotFoundException),则交由自己处理去加载

自定义加载器的话,需要继承ClassLoader。
不想打破双亲委派模型,就重写findClass()方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。
想打破双亲委派模型则重写loadClass() 方法。

// BootstrapClassLoader是JVM自身的一部分,其他的ClassLoader都是在JVM外部实现的,并且都继承自ClassLoader抽象类

public static void main(String[] args) {
    // 注意: 因为使用的xxx.class,所以Tom类加载中的初始化步骤不会执行
    
    // jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
    System.out.println(Tom.class.getClassLoader());
    // jdk.internal.loader.ClassLoaders$PlatformClassLoader@52cc8049(PlatformClassLoader是JDK9的,JDK8是ExtClassLoader)
    System.out.println(Tom.class.getClassLoader().getParent());
    // null(即 BootstrapClassLoader)
    System.out.println(Tom.class.getClassLoader().getParent().getParent());
}

你可能感兴趣的:(JVM,jvm,java)